NullReferenceException в модульном тестировании с NUnit, NSubstitute и асинхронным методом - PullRequest
0 голосов
/ 14 ноября 2018

Я занимаюсь модульным тестированием в C # с использованием NUnit и NSubstitute.У меня есть класс с именем Adapter, у которого есть метод GetTemplates(), я хочу провести модульное тестирование.GetTemplates() использует httpclient, который я смоделировал с помощью интерфейса.

Вызов в GetTemplates выглядит примерно так:

public async Task<List<Template>> GetTemplates()
{
    //Code left out for simplificity. 

    var response = await _client.GetAsync($"GetTemplates");

    if (!response.IsSuccessStatusCode)
    { 
        throw new Exception();
    }

}

Я хочу, чтобы _client.GetAsync вернулHttpResponseMessage с HttpStatusCode.BadRequest, чтобы я мог проверить, генерируется ли исключение.

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

[Test]
public void GetTemplate_ReturnBadRequestHttpMessage_ThrowException()
{
     //Arrange.
     var httpMessage = new HttpResponseMessage(HttpStatusCode.BadRequest);
     _client.GetAsync("").Returns(Task.FromResult(httpMessage));

     //Act.
     var ex = Assert.ThrowsAsync<Exception>(async () => await _Adapter.GetSigningTemplates());

     //Assert.
     Assert.IsInstanceOf<Exception>(ex);
 }

Когда метод запущен, он возвращает

System.NullReferenceException: ссылка на объект не установлена ​​для экземпляра объекта.

Что я сделал не так?

1 Ответ

0 голосов
/ 14 ноября 2018

Это связано с тем, что расположение поддельного клиента не соответствует тому, что фактически вызывается при выполнении теста.

Клиент ожидает

var response = await _client.GetAsync($"GetTemplates");

, но настройка для

 _client.GetAsync("")

обратите внимание на различные переданные аргументы.Когда mocks не получают точно то, что было настроено, они обычно возвращают значение по умолчанию своего типа возврата, который в этом случае равен null .

Измените тест, чтобы использовать ожидаемый параметр

_client.GetAsync($"GetTemplates").Returns(Task.FromResult(httpMessage));

Ссылка Возврат для определенных аргументов

или использование соответствия аргументов

_client.GetAsync(Arg.Any<string>()).Returns(Task.FromResult(httpMessage));

Ссылка Сопоставления аргументов

...