我在我的项目中使用Mediator。
我想在我的项目中使用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();
}
}
这是用于ConfigorationSingltonConfigoration
的appSetting-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:该方法或操作未实现。
怎么了?我该如何解决这个问题?我将项目的源代码放在问题的顶部
我怀疑验证器未在容器中注册。
您可以通过安装nuget而不是传递程序集,将.NET Core中的FluentValidation与依赖注入一起使用。
Using FluentValidation in .NET Core with Dependency Injection处有更多参考文献。
Fluent Validation on .NET Core 2.0 does not register上如何执行此操作的更多参考。