2016-07-23 4 views
0

У меня есть приложение ASP.NET MVC Core, для которого я пишу модульные тесты. Я использую InMemoryDatabase и отлично работает. Я хочу инициализировать базу данных один раз для тестового запуска. Таким образом, у меня есть статический класс:Повторное использование InMemoryDatabase для модульных тестов

public static class DbInitialize { 
    private static MyDbContext _db; 

    public static MyDbContext Initialize() { 
     if (_db != null) { 
      return _db; 
     } 
     DbContextOptionsBuilder<MyDbContext> optionsBuilder = new DbContextOptionsBuilder<MyDbContext>(); 
     optionsBuilder.UseInMemoryDatabase(); 
     _db = new MyDbContext(optionsBuilder.Options); 
     ....... (populating mock data) ............. 
     _db.SaveChanges(); 
     return _db; 
    } 
} 

прекрасно работает для одного тестового класса (скажем, HomeControllerTests) и всех его специфических тестов. Однако, если у меня есть другой тестовый класс (CustomerControllerTests), и я звоню DbInitialize.Initialize() - я вижу, что _db имеет значение NULL, но база данных не была уничтожена - я получаю ошибку ключа во время SaveChanges(). Есть ли лучший способ инициализировать базу данных только один раз и получить «строку соединения» (из-за отсутствия лучшего слова), если она уже запущена и работает?

+0

Что произойдет, если вы каждый раз создаете 'DbContext' с вашими параметрами (без данных)? –

+0

@GabrielGM - Я не уверен, что понимаю ваш вопрос. Если я создам DbContext без данных вообще - ничего плохого не произойдет, за исключением того, что у меня нет данных, а модульные тесты явно не работают. – Felix

+0

Вы говорите, что ваш '_db' является нулевым, хотя он и существует в памяти. Когда это произойдет, вы можете воссоздать '_db'. Я имею в виду, Create и семена в первый раз. После этого просто создайте. –

ответ

0

Оказалось, xUnit имеет ответ для этой ситуации - Collection Fixture. Я следовал инструкциям там, и это сработало. Надеюсь, это тоже поможет кому-то еще :)

Смежные вопросы