参数匹配不能与 NSubstitute 一起正常工作
Posted
技术标签:
【中文标题】参数匹配不能与 NSubstitute 一起正常工作【英文标题】:Argument matching not working properly with NSubstitute 【发布时间】:2016-09-30 18:31:01 【问题描述】:我有这段代码,无论如何我都无法让 httpClient 返回字符串响应。
HttpClient httpClient = Substitute.For<HttpClient>();
httpClient.PostAsync("/login", Arg.Any<StringContent>())
.Returns(this.StringResponse("\"token\": \"token_content\""));
Console.WriteLine(await httpClient.PostAsync("/login", new StringContent(string.Empty)) == null); // True
如果有人想重现这个,这里是StringResponse
方法:
private HttpResponseMessage StringResponse(string content)
var response = new HttpResponseMessage(HttpStatusCode.OK);
if (content != null)
response.Content = new StringContent(content);
return response;
我做错了什么?
当我这样做时它会起作用
httpClient.PostAsync("/login", Arg.Any<StringContent>())
.ReturnsForAnyArgs(this.StringResponse("\"token\": \"token_content\""));
但我不需要任何参数,我需要其中一个为字符串"/login"
,另一个为StringContent
类型。
我尝试在 Arg.Is
调用中添加更通用的内容,例如 HttpContent
,但这也不起作用。
我在 .NET Core 上使用 NSubstitute 2.0.0-rc
,但我也尝试在标准控制台应用程序上使用 NSubstitute 1.10.0
并得到相同的结果。
【问题讨论】:
您使用的是哪个版本的 nsubstitute? (我现在正在尝试重现该问题。) 我在 .Net Core 中使用 2.0.0-rc,但在普通控制台应用程序上尝试使用 1.10.0 的代码并得到相同的结果。 嗯。复制了它,但还没有设法修复它...... 我认为我用 NSubstitute 做了一些明显愚蠢的事情,因为这是我第一次使用它。 我怀疑这是问题所在:“警告:替换类可能会产生一些令人讨厌的副作用。对于初学者来说,NSubstitute 只能与类的虚拟成员一起使用,因此任何非虚拟代码在课程将真正执行!”PostAsync
不是虚方法...
【参考方案1】:
这里的问题是public Task<HttpResponseMessage> PostAsync(string requestUri, HttpContent content)
方法不是虚拟的,NSubstitute 无法正确链接您的参数规范并将值返回到该方法。这是所有基于Castle.Core
的模拟库的问题。
重要的是 NSubstitute 将规范链接到执行堆栈中的第一个虚拟方法,结果证明是堆栈下方某处的 public override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
方法。您“幸运”在其中具有相同的返回类型。正如您所看到的,它有不同的论点,显然与您提供的论点不匹配。令人惊讶的是 ReturnsForAnyArgs()
有效,因为它不检查您提供的参数规范。
【讨论】:
我自己永远也想不出那个,谢谢!以上是关于参数匹配不能与 NSubstitute 一起正常工作的主要内容,如果未能解决你的问题,请参考以下文章
dbms_output.put_line 不能与游标一起正常工作