web-dev-qa-db-ja.com

xUnitで依存性注入を使用することはできますか?

IServiceを必要とするコンストラクターを持つテストクラスがあります。

public class ConsumerTests
{
    private readonly IService _service;
    public ConsumerTests(IService servie)
    {
      _service = service;
    }

    [Fact]
    public void Should_()
    {
       //use _service
    }
}

選択したDIコンテナをプラグインするを構築してテストクラスをビルドします。

これはxUnitで可能ですか?

20
Rookian

はい、今あります。これらの2つの質問と回答は、私の意見にまとめる必要があります。回答はこちらをご覧ください

ネットコア:AppService、リポジトリなどのXunitテストですべての依存性注入を実行

以下のカスタムWebアプリケーションファクトリとServiceProvider.GetRequiredServiceを使用して、回答を自由に編集および最適化してください

CustomWebApplicationFactory:

public class CustomWebApplicationFactory<TStartup> : WebApplicationFactory<TStartup> where TStartup : class
{
    protected override void ConfigureWebHost(IWebHostBuilder builder)
    {
        builder.ConfigureAppConfiguration((hostingContext, configurationBuilder) =>
        {
            var type = typeof(TStartup);
            var path = @"C:\\OriginalApplication";

            configurationBuilder.AddJsonFile($"{path}\\appsettings.json", optional: true, reloadOnChange: true);
            configurationBuilder.AddEnvironmentVariables();
        });

        // if you want to override Physical database with in-memory database
        builder.ConfigureServices(services =>
        {
            var serviceProvider = new ServiceCollection()
                .AddEntityFrameworkInMemoryDatabase()
                .BuildServiceProvider();

            services.AddDbContext<ApplicationDBContext>(options =>
            {
                options.UseInMemoryDatabase("DBInMemoryTest");
                options.UseInternalServiceProvider(serviceProvider);
            });
        });
    }
}

統合テスト:

public class DepartmentAppServiceTest : IClassFixture<CustomWebApplicationFactory<OriginalApplication.Startup>>
{
    public CustomWebApplicationFactory<OriginalApplication.Startup> _factory;
    public DepartmentAppServiceTest(CustomWebApplicationFactory<OriginalApplication.Startup> factory)
    {
        _factory = factory;
        _factory.CreateClient();
    }

    [Fact]
    public async Task ValidateDepartmentAppService()
    {      
        using (var scope = _factory.Server.Host.Services.CreateScope())
        {
            var departmentAppService = scope.ServiceProvider.GetRequiredService<IDepartmentAppService>();
            var dbtest = scope.ServiceProvider.GetRequiredService<ApplicationDBContext>();
            dbtest.Department.Add(new Department { DepartmentId = 2, DepartmentCode = "123", DepartmentName = "ABC" });
            dbtest.SaveChanges();
            var departmentDto = await departmentAppService.GetDepartmentById(2);
            Assert.Equal("123", departmentDto.DepartmentCode);
        }
    }
}

リソース:

https://docs.Microsoft.com/en-us/aspnet/core/test/integration-tests?view=aspnetcore-2.2

https://fullstackmark.com/post/20/painless-integration-testing-with-aspnet-core-web-api

3
user11860043

このソースコードからnugetパッケージを使用してこれを行う方法があります。 https://github.com/dennisroche/xunit.ioc.autofac

[Fact]が、使用を開始するとブロックされました[Theory]。これを整理するプルリクエストがあります。

自分のブロックを解除するために、CollectionFixtureを使用してContainerを注入し、ContainerからInterfaceを解決しました。

2
Siva Kandaraj