Интегральные тесты - ASP. NET Core - PullRequest
1 голос
/ 27 февраля 2020

Я определяю свой тестовый класс, как показано ниже, и создается один тест. Я запутался в том, как вызывается мой контроллер. Я делаю одни и те же вызовы GetAsyn c дважды, используя один и тот же клиент, но похоже, что каждый вызов сталкивается с различным экземпляром контроллера (в зависимости от значения GetHashCode ()) ... Итак ... каждый из клиентов. * Asyn c () вызовы типа GetAsyn c, PutAsyn c .. всегда попадают в другой экземпляр контроллера? Даже если использовать тот же клиент? Есть ли способ поразить тот же экземпляр ??

// My test class is defined as:
public class ApiControllerIT : IClassFixture<WebApplicationFactory<Startup>> {

   public ApiControllerIT(WebApplicationFactory<Startup> factory)
   {
       _factory = factory;
   }


// test case
[Theory]
[InlineData("/api/values")]
public async Task GET_All_ReturnSuccessAndCorrectContent(string url)
{
    try
    {
        // Arrange
        var client = _factory.CreateClient();

        // Act
        var response = await client.GetAsync(url);
        response = await client.GetAsync(url);

    } 
 ...
}

1 Ответ

1 голос
/ 27 февраля 2020

В веб-API ASP. NET экземпляр контроллера создается для каждого HTTP-запроса, который будет обрабатываться этим контроллером. См. это обсуждение для получения более подробной информации о том, почему это так.

Если вы хотите написать тесты, которые выполняют несколько вызовов на один и тот же контроллер, вы бы хотели создать экземпляр контроллера в своем тесте. и вызывать методы непосредственно на контроллере, вместо того чтобы делать вызовы через HTTP-клиент.

// test case
[Theory]
public void GET_All_ReturnSuccessAndCorrectContent()
{
    try
    {
        // Arrange
        var controllerUnderTest = CreateApiControllerIT();

        // Act
        var response = controllerUnderTest.GetAll();
        response = controllerUnderTest.GetAll();

    } 
 ...
}
...