也许我错过了一些东西,或者某些事情可能已经破裂了。我希望能找到这里发生的事情。
TLDR:使用InMemory数据库引导TestServer
类,得到
(No service for type 'Microsoft.Data.Entity.Storage.IRelationalConnection' has been registered)
。有线索吗?更多详情如下:
我有一个测试类,它使用TestFixture来引导:
public AccountControllerTest(TestServerFixture testServerFixture) : base(testServerFixture)
{
}
testServerFixture看起来像这样: 公共类TestServerFixture:IDisposable { public TestServer server {get; }
public HttpClient client { get; }
public TestServerFixture()
{
// Arrange
var builder = TestServer.CreateBuilder()
.UseEnvironment("Development")
.UseStartup<TestPortalStartup>()
.UseServices(services =>
{
// Change the application environment to the mvc project
var env = new TestApplicationEnvironment();
env.ApplicationBasePath =
Path.GetFullPath(Path.Combine(PlatformServices.Default.Application.ApplicationBasePath, "..", "MY_APP"));
env.ApplicationName = "MY_APP";
//SUPER IMPORTANT: Should be the real application name, else you'll get Roslyn Compiler Errors in your views
services.AddInstance<IApplicationEnvironment>(env);
});
server = new TestServer(builder);
client = server.CreateClient();
}
public void Dispose()
{
server.Dispose();
client.Dispose();
}
}
正如您所看到的,它使用TestPortalStartup
,如下所示:
公共类TestPortalStartup:启动
{
private Mock accountRegistrationClientMock;
public TestPortalStartup(IHostingEnvironment env, IApplicationEnvironment appEnv) : base(env, appEnv)
{
}
public override void SetUpDataBaseAndMigrations(IServiceCollection services)
{
services
.AddEntityFramework()
.AddInMemoryDatabase()
.AddDbContext<CmsDbContext> (
options => options.UseInMemoryDatabase()
);
}
public override void AddFrameworkDependencies(IServiceCollection services)
{
// ... not relevant
}
}
正如您在SetUpDataBaseAndMigrations
中看到的那样,我们引导了InMemoryDatabase
和DbContext
。
之前我使用过这个构造来测试处理数据库的服务。 (但这是孤立的)。
现在进行集成测试后,我最终无法通过以下方式引导测试:
结果StackTrace:at Microsoft.Extensions.DependencyInjection.ServiceProviderExtensions.GetRequiredService(的IServiceProvider provider,输入serviceType)at Microsoft.Extensions.DependencyInjection.ServiceProviderExtensions.GetRequiredService [T](的IServiceProvider 提供者) Microsoft.Data.Entity.Infrastructure.AccessorExtensions.GetService [TService](IInfrastructure`1 访问者) Microsoft.Data.Entity.RelationalDatabaseFacadeExtensions.GetRelationalConnection(DatabaseFacade databaseFacade)at Microsoft.Data.Entity.RelationalDatabaseFacadeExtensions.GetDbConnection(DatabaseFacade databaseFacade)at MY_APP.Portal.Startup.Configure(IApplicationBuilder app, IHostingEnvironment env,ILoggerFactory loggerFactory)in MY_APP / Startup.cs:第175行结果消息:一个或多个错误 发生了。没有类型的服务 &#39; Microsoft.Data.Entity.Storage.IRelationalConnection&#39;一直都是 注册。以下构造函数参数没有匹配 夹具数据:TestServerFixture testServerFixture
如果你想知道在MY_APP/Startup.cs
(第175行)发生了什么:
logger.LogInformation($"Using SQL Connection: {dbContext.Database.GetDbConnection().DataSource}");
使用&#39;正常&#39;数据库(即不是内存中的数据库)将通过测试。
所以看起来缺少一些依赖/布线?有人有这方面的经验吗?线索?等
答案 0 :(得分:1)
在AspDotNet github上发布此问题之后,答案是来自EntityFramework本身的InMemoryDatabase本身不打算进行集成测试。
另一种方法是使用SQLite - 但后来也使用内存模式。
由于创建所有这些(从头开始到完全工作的集成测试)花了我很长时间才弄明白。我想我会在博客文章中将这一切都归结为: