第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

ASP.NET Core 2.2 集成測試 DbContext 服務未注冊

ASP.NET Core 2.2 集成測試 DbContext 服務未注冊

C#
函數(shù)式編程 2022-12-24 14:57:24
設置視窗 10Visual Studio 專業(yè)版 2017 v15.9.9ASP.NET 核心 2.2英孚核心 2.2小巧玲瓏xUnit 2.4.1描述我正在使用WebApplicationFactory包中的Microsoft.AspNetCore.Mvc.Testing來設置我的集成測試。我一直在關注官方文檔來自定義虛擬主機配置。SUT 使用 Dapper 從數(shù)據(jù)庫中查詢,因此我沒有使用 EF Core 附帶的內存提供程序來進行此特定集成測試。我設置的代碼WebApplictionFactory如下:public class CustomWebApplicationFactory<TStartup>    : WebApplicationFactory<TStartup> where TStartup : class{    protected override void ConfigureWebHost(IWebHostBuilder builder)    {        builder            .UseStartup<TStartup>()            .ConfigureServices(services =>        {            var sp = services.BuildServiceProvider();            // Create a scope to obtain a reference to the database context            using (var scope = sp.CreateScope())                {                var scopedServices = scope.ServiceProvider;                var dbContext = scopedServices.GetRequiredService<MyDbContext>(); // <-- service not found                dbContext.Database.EnsureCreated();                new MyDbContextSeed()                    .SeedAsync(dbContext)                    .Wait();            }        });    }}問題MyDbContext找不到該服務,我明白為什么(我認為)- 因為ServiceProvider我的Startup.cs班級尚未構建。但問題是如何從我的 Startup 類訪問服務?對于上下文,集成測試如下所示:public class MyAPITests    : IClassFixture<CustomWebApplicationFactory<Startup>>{    private readonly HttpClient _client;    private readonly CustomWebApplicationFactory<Startup> _factory;    public MyAPITests(CustomWebApplicationFactory<Startup> factory)    {        _factory = factory;        _client = factory.CreateClient();    }    [Fact]    public async Task Get_ItemAsync_WhenIdNotFound_ReturnsNotFoundStatusCode()    {        // Arrange        var request = new HttpRequestMessage(HttpMethod.Get, "api/v1/item/0");        // Act        var response = await _client.SendAsync(request);        // Assert        Assert.Equal(HttpStatusCode.NotFound, response.StatusCode);    }}
查看完整描述

1 回答

?
慕的地6264312

TA貢獻1817條經(jīng)驗 獲得超6個贊

首先,ConfigureServices可以代替UseStartup,不能一起使用。其次,您不應該創(chuàng)建范圍并在此期間進行遷移ConfigureServices,而是在構建 Web 主機之后,請參見此處:


Configure在較早的教程中,您可能會在 Startup.cs的方法中看到類似的代碼。我們建議您僅使用 Configure 方法來設置請求管道。應用程序啟動代碼屬于該 Main方法。


這樣做的唯一方法不是在工廠中,而是在工廠建造之后:


public class MyAPITests

    : IClassFixture<CustomWebApplicationFactory<Startup>>

{

    private readonly HttpClient _client;

    private readonly CustomWebApplicationFactory<Startup> _factory;


    public MyAPITests(CustomWebApplicationFactory<Startup> factory)

    {

        _factory = factory;

        _client = factory.CreateClient();


        var host = factory.Server.Host;

        using (var scope = host.Services.CreateScope())

        {

            var scopedServices = scope.ServiceProvider;

            var dbContext = scopedServices.GetRequiredService<MyDbContext>();


            dbContext.Database.EnsureCreated();


            new MyDbContextSeed()

                .SeedAsync(dbContext)

                .Wait();

        }

    }


    //...

}


查看完整回答
反對 回復 2022-12-24
  • 1 回答
  • 0 關注
  • 146 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號