0

Я пытаюсь интегрировать тест моего приложения.Как протестировать действия базы данных в тесте интеграции ядра asp.net?

например, в моем AbController У меня есть метод PostAb(AbDTO abDTO), и я хочу проверить, что вызов этого метода добавит abDTO в db.

теперь мой тест установки:

[SetUp] 
    public void SetUp() 
    { 
     _server = new TestServer(new WebHostBuilder() 
      .UseEnvironment("testing") 
      .UseStartup<Startup>()); 

     _client = _server.CreateClient(); 
    } 

и мой тест должен выглядеть следующим образом:

[Test] 
    public async Task PostAbSanity() 
    { 
     await _client.PostAsync("/rest/v1/Ab", new Ab{Id=1}); 
     _context.Abs.find(1).should().NotBeNull(); 
    } 

, но, как я могу вводить _context в тест? в моем приложении я добавляю его через конструкторы, но в тестах я не могу.

спасибо!

+0

Я бы предположил, что после публикации вы получите сообщение, чтобы проверить, что опубликованная запись была создана. – Nkosi

+0

Но не для всех моих методов сообщения существует противоположный get, и наоборот – arielorvits

+0

, а также я не уверен. Это хорошая идея, так как вместо этого тест будет сосредоточен на его методе, он также вызовет много других API для посева db и т. д., это нормальный метод интеграции теста? – arielorvits

ответ

1

Я предполагаю, что вы помощью SQLite, так что вы можете изменить способ установки как это:

[SetUp] 
public void SetUp() 
{ 
    _server = new TestServer(new WebHostBuilder() 
     .UseEnvironment("testing") 
     .UseStartup<Startup>()); 

    _client = _server.CreateClient(); 

    var optionsBuilder = new DbContextOptionsBuilder<BloggingContext>(); 

    optionsBuilder.UseSqlite("Filename=./blog.db"); 

    _context = new BloggingContext(optionsBuilder.Options); 
} 

Пожалуйста, дайте мне знать, если это полезно

+0

нет, он не заменит _context, который был зарегистрирован при запуске.cs like: 'public void ConfigureServices (службы IServiceCollection) { var connection = @" Server = (localdb) \ mssqllocaldb; Database = EFGetStarted.AspNetCore.NewDb; Trusted_Connection = True; "; services.AddDbContext (options => options.UseSqlServer (соединение)); ' см. В первой ссылке – arielorvits

+0

Что вы используете? Sql Server или SqlLite –

+0

в тесте интеграции Я использую sql-сервер, чтобы быть максимально похожим на мой реальный db. – arielorvits

0

Если вы хотите запустить тест блока против базы данных, я могу предложить использовать стороннюю библиотеку, такую ​​как MyTested.AspNetCore.Mvc.

Добавление данных до фактического вызова действия:

MyMvc 
    .Controller<MvcController>() 
    .WithDbContext(db => db.WithEntities(entities => entities 
     .AddRange(SampleDataProvider.GetModels()))) 
    .Calling(c => c.SomeAction()) 
    .ShouldReturn() 
    .View() 
    .WithModelOfType<List<ResponseModel>>() 
    .Passing(m => m.Count == 6); 

Утверждая базу данных после того, как действие было выполнено:

MyMvc 
    .Controller<MvcController>() 
    .Calling(c => c.SomeAction()) 
    .ShouldHave() 
    .DbContext(db => db 
     .WithEntities<CustomDbContext>(db => 
      db.Models.Find(1) != null)) 
    .AndAlso() 
    .ShouldReturn() 
    .Ok(); 

Это GitHub страница проекта - https://github.com/ivaylokenov/MyTested.AspNetCore.Mvc и это очень подробный tutorial для Это.

+0

Я не вижу, как это ответ на мой вопрос. – arielorvits

+0

Дело в том, что среда тестирования автоматически добавит контекст в ваши контроллеры. –

+0

также встроенный TestServer автоматически вставляет контекст в мои контроллеры (или службы). Я хочу вставить контекст в тест, например '_context.Abs.find (1) .should(). NotBeNull();' Возможно, эта среда позволяет это, но я не вижу этого в вашем примере и не могу найти в документах (которые отсутствуют) – arielorvits