Возможно, я что-то упустил, а может, что-то сломалось. Я надеюсь узнать, что здесь происходит.
TL; DR: загрузка TestServer класса с базой данных InMemory дает
(No service for type 'Microsoft.Data.Entity.Storage.IRelationalConnection' has been registered). Какие-нибудь подсказки? Более подробная информация ниже:
У меня есть тестовый класс, который использует TestFixture для начальной загрузки:
public AccountControllerTest(TestServerFixture testServerFixture) : base(testServerFixture)
{
}
TestServerFixture выглядит так: общедоступный класс TestServerFixture: IDisposable {общедоступный сервер TestServer {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: Startup {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: в Microsoft.Extensions.DependencyInjection.ServiceProviderExtensions.GetRequiredService (поставщик IServiceProvider, тип serviceType) в Microsoft.Extensions.DependencyInjection.ServiceProviderExtensions.GetRequiredService [T] (IServiceProviderExtensions.GetRequiredService. TService] (средство доступа IInfrastructure`1) в Microsoft.Data.Entity.RelationalDatabaseFacadeExtensions.GetRelationalConnection (DatabaseFacade databaseFacade) в Microsoft.Data.Entity.RelationalDatabaseFacadeExtensions.GetDbConnection (DatabaseFacade databaseFacadeExtensions.GetDbConnection (DatabaseFacade databaseFacade. , ILoggerFactory loggerFactory) в MY_APP / Startup.cs: строка 175 Сообщение о результате: произошла одна или несколько ошибок. Служба для типа Microsoft.Data.Entity.Storage.IRelationalConnection не зарегистрирована. Следующие параметры конструктора не имеют совпадающих данных фикстур: TestServerFixture testServerFixture
Если вам интересно, что происходит в MY_APP/Startup.cs (строка 175), а именно:
logger.LogInformation($"Using SQL Connection: {dbContext.Database.GetDbConnection().DataSource}");
Запуск с «нормальной» базой данных (т. Е. Не с базой данных в памяти) ПРОВОДИТ тест.
Значит, похоже, что отсутствуют какие-то зависимости / проводка? У кого-нибудь есть опыт в этом? Подсказки? и Т. Д.