Исключение NullReferenceException в unittesting с помощью метода NUnit, NSubstitute и async

Я занимаюсь тестированием модулей на 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 чтобы я мог проверить, 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 ответ


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

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

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

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

 _client.GetAsync("")

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

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

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

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

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

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

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


Есть идеи?

10000