我正在使用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:对象引用未设置为对象的实例。
我做错了什么?
答案 0 :(得分: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));