【问题标题】:Argument matching not working properly with NSubstitute参数匹配不能与 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 不是虚方法...

标签: c# .net mocking httpclient nsubstitute


【解决方案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() 有效,因为它不检查您提供的参数规范。

【讨论】:

  • 我自己永远也想不出那个,谢谢!
猜你喜欢
  • 2018-11-10
  • 2014-07-01
  • 1970-01-01
  • 2016-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多