将TDD中的中介者cqrs用于集成测试.net核心3

问题描述 投票:1回答:1

我在我的项目中使用Mediator。

Demo Project on Github

我想在我的项目中使用TDD并与.Net core 3.0进行集成测试

我将此代码int测试类编写为与中介程序一起使用集成测试:

public class SubscribeTest : IClassFixture<TravelRequest<Startup>>, IClassFixture<DbContextFactory>, IDisposable
{
    private readonly TravelRequest<Startup> request;
    private readonly DbContextFactory contextFactory;
    public SubscribeTest(TravelRequest<Startup> request , DbContextFactory contextFactory)
    {
        this.request = request;
        this.contextFactory = contextFactory;
    }


    public void Dispose()
    {
        request.Dispose();
    }

    [Fact]
    public async Task ListSubscribeAsync()
    {
        var add = await request.Get("/Subscribe/GetListSubscribe");
        await add.BodyAs<SubscribListDto>();
    }
}

这是TravelRequest

    public class TravelRequest<TStartup> : IDisposable where TStartup : class
    {
        private readonly HttpClient client;
        private readonly TestServer server;

        public TravelRequest()
        {
            var webHostBuilder = new WebHostBuilder().UseStartup<TStartup>().UseConfiguration(ConfigorationSingltonConfigoration.GetConfiguration());
            this.server = new TestServer(webHostBuilder);
            this.client = server.CreateClient();
        }
    }

这是用于ConfigorationSingltonConfigorationappSetting-test.json

public class ConfigorationSingltonConfigoration
{
    private static IConfigurationRoot configuration;
    private ConfigorationSingltonConfigoration() { }
    public static IConfigurationRoot GetConfiguration()
    {
        if (configuration is null)
            configuration = new ConfigurationBuilder()
             .SetBasePath(Path.Combine(Path.GetFullPath("../../../")))
            .AddJsonFile("appsettings-test.json")
            .AddEnvironmentVariables()
            .Build();
        return configuration;
    }
}

最后这是给定的DbContext

 public class DbContextFactory : IDisposable
{
    public TravelContext Context { get; private set; }
    public DbContextFactory()
    {
        var dbBuilder = GetContextBuilderOptions<TravelContext>("SqlServer");

        Context = new TravelContext(dbBuilder.Options);
        Context.Database.Migrate();
    }

    public void Dispose()
    {
        Context.Dispose();
    }

    public TravelContext GetRefreshContext()
    {
        var dbBuilder = GetContextBuilderOptions<TravelContext>("SqlServer");
        Context = new TravelContext(dbBuilder.Options);

        return Context;
    }

    private DbContextOptionsBuilder<TravelContext> GetContextBuilderOptions<T>(string connectionStringName)
    {
        var connectionString = ConfigorationSingltonConfigoration.GetConfiguration().GetConnectionString(connectionStringName);
        var contextBuilder = new DbContextOptionsBuilder<TravelContext>();
        var servicesCollection = new ServiceCollection().AddEntityFrameworkSqlServer().BuildServiceProvider();

        contextBuilder.UseSqlServer(connectionString).UseInternalServiceProvider(servicesCollection);

        return contextBuilder;
    }
}

Now我的问题在这里,当我RunTest结果显示给我这个错误时:

---- System.InvalidOperationException:无法解析类型为'System.Collections.Generic.IList1 [FluentValidation.IValidator1 [Travel.Services.SubscribeServices.Query.SubscribeList.SubscribeListCommand]]'的服务,同时尝试激活'Travel。 Common.ValidateBehavior.ValidateCommandBehavior2 [Travel.Services.SubscribeServices.Query.SubscribeList.SubscribeListCommand,Travel.Common.Operation.OperationResult1 [System.Collections.Generic.IEnumerable`1 [Travel.ViewModel.SubscibeDto.SubscribListDto]]]。 ---- System.NotImplementedException:该方法或操作未实现。

怎么了?我该如何解决这个问题?我将项目的源代码放在问题的顶部

c# asp.net unit-testing xunit mediator
1个回答
0
投票

我怀疑验证器未在容器中注册。

您可以通过安装nuget而不是传递程序集,将.NET Core中的FluentValidation与依赖注入一起使用。

Using FluentValidation in .NET Core with Dependency Injection处有更多参考文献。

Fluent Validation on .NET Core 2.0 does not register上如何执行此操作的更多参考。

© www.soinside.com 2019 - 2024. All rights reserved.