【问题标题】:NSubstitute Error UnexpectedArgumentMatcherExceptionNSubstitute 错误 UnexpectedArgumentMatcherException
【发布时间】:2018-04-05 10:20:54
【问题描述】:

我收到以下错误:

NSubstitute.Exceptions.UnexpectedArgumentMatcherException: '参数 matchers (Arg.Is, Arg.Any) 只能用来代替 member 论据。不要在 Returns() 语句或其他任何地方使用 在成员调用之外。正确使用:
sub.MyMethod(Arg.Any()).Returns("hi") 使用不正确:
sub.MyMethod("hi").Returns(Arg.Any())'

当试图模拟出以下界面时:

public interface IMyDate
{
    DateTime GetDate();
}

这是我嘲笑它的地方:

var myDate = Substitute.For<IMyDate>();
myDate.GetDate().Returns(testDate); // Error thrown here

请任何人解释我做错了什么?

var myDate = Substitute.For<IMyDate>();
myDate.GetDate().Returns(new DateTime(2018, 04, 05)); // Error thrown here

给出相同的结果。

【问题讨论】:

    标签: c# mocking nsubstitute


    【解决方案1】:

    这可能是由于之前的测试存在问题。有关跟踪此问题的一些步骤,请参阅this answer。我在下面包含了该答案的快照:

    这很像之前使用参数匹配器的测试 针对非虚拟方法,或在 Returns 语句中。

    不幸的是,这可能很难调试。第一步是看 如果在此夹具中运行所有测试时出现问题。如果 因此,请检查该夹具中 Arg.Is|Any 的所有用法,从 在失败的测试之前立即运行的一个(如果您的测试 框架使用可预测的测试顺序,否则您需要查看 在测试日志中查看哪些测试会继续失败的测试)。

    如果该装置没有发生这种情况,您需要查看 预先运行以查看剩余 arg 匹配器在哪里的固定装置 来自(哪里。它很可能在失败的测试附近。

    希望这会有所帮助。正面消息是,下一个 NSubstitute 版本 (v4) 将在这些情况下提供更多帮助。

    另请参阅:How not to use argument matchers

    【讨论】:

      【解决方案2】:

      testDate 很可能是一个参数匹配器(Arg.IsArg.Any

      异常消息告诉您仅将参数匹配器用作成员调用参数,而不是作为返回值,但您正在将其用作返回值...

      “不要在 Returns() 语句或成员调用之外的任何其他地方使用”

      试试

      var testDate = new DateTime(); //<-- try setting the desired date as needed
      var myDate = Substitute.For<IMyDate>();
      myDate.GetDate().Returns(testDate);
      

      参考NSubstitute: Argument matchers

      【讨论】:

      • 它给出了相同的结果。请参阅我的问题中的更新。
      • @qwerty 我非常怀疑错误是否相同。抛出的新错误是什么?
      • 我只是在本地对其进行了测试,它工作正常,正如@NKosi 所说,可能是一个不同的错误。
      • 不知道该告诉你什么——同样的错误。 testDate 事先已经是硬编码的日期。
      • 这很奇怪,请确保重新编译工作正常,并且您没有得到一些源代码不同的旧二进制文件
      【解决方案3】:

      在我们的例子中,随机测试发送此错误消息,但仅在运行所有测试时发送。我们从 4.6.1 迁移到 netcore 3.1 时发现了这个错误。

      问题是没有任何替代品的测试类使用Arg.Any&lt;int&gt;() 表达式,原因不明。

      删除这段未经检查的代码Arg.Any&lt;int&gt;() 是解决方案。

      【讨论】:

        【解决方案4】:

        要解决此问题,您需要确定导致该问题的方法,这可以是您尝试调用的方法或您尝试调用的方法中的另一个嵌套方法...

        将该方法设为虚拟可解决此问题。

        如果您替换的是类而不是接口,请检查对替换的调用是否在虚拟/抽象成员上。 不能为非虚拟/非抽象成员配置返回值。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-02-12
          相关资源
          最近更新 更多