使用NUnit,NSubstitute和异步方法进行单元测试时发生NullReferenceException

时间:2018-11-14 09:02:18

标签: asp.net unit-testing async-await nunit nsubstitute

我正在使用NUnit和NSubstitute在C#中进行一些单元测试。我有一个名为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的{​​{1}},以便我可以测试是否引发了异常。

测试方法如下:

HttpStatusCode.BadRequest

该方法运行后会返回

  

System.NullReferenceException:对象引用未设置为对象的实例。

我做错了什么?

1 个答案:

答案 0 :(得分:1)

这是因为模拟客户端的安排与执行测试时实际调用的内容不匹配。

客户期望

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

但设置适用于

 _client.GetAsync("")

请注意传递的不同参数。当模拟无法完全得到所设置的内容时,它们通常会返回其返回类型的默认值,在这种情况下为 null

将测试更改为使用预期参数

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

引用Return for specific args

或使用参数匹配器

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

引用Argument matchers