参数匹配不能与 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&lt;HttpResponseMessage&gt; PostAsync(string requestUri, HttpContent content) 方法不是虚拟的,NSubstitute 无法正确链接您的参数规范并将值返回到该方法。这是所有基于Castle.Core 的模拟库的问题。

重要的是 NSubstitute 将规范链接到执行堆栈中的第一个虚拟方法,结果证明是堆栈下方某处的 public override Task&lt;HttpResponseMessage&gt; SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) 方法。您“幸运”在其中具有相同的返回类型。正如您所看到的,它有不同的论点,显然与您提供的论点不匹配。令人惊讶的是 ReturnsForAnyArgs() 有效,因为它不检查您提供的参数规范。

【讨论】:

我自己永远也想不出那个,谢谢!

以上是关于参数匹配不能与 NSubstitute 一起正常工作的主要内容,如果未能解决你的问题,请参考以下文章

dbms_output.put_line 不能与游标一起正常工作

SizeToFit() 不能与 \n 一起正常工作?

(Smooth)ScrollToPosition 不能与 RecyclerView 一起正常工作

UISlider 不能与 AVPlayer 一起正常工作

isnan 不能与 `-Ofast` 标志一起正常工作

DirtyForms 不能与 $.blockUI 一起正常工作