NSubstitute Error UnexpectedArgumentMatcherException

时间:2018-04-05 10:20:54

标签: c# mocking nsubstitute

我收到以下错误:

  

NSubstitute.Exceptions.UnexpectedArgumentMatcherException:'Argument   matchers(Arg.Is,Arg.Any)只能用于代替成员   参数。不要在Returns()语句或其他任何地方使用   在会员电话之外。正确使用:
  sub.MyMethod(Arg.Any())。返回(“hi”)使用不正确:
  sub.MyMethod( “HI”),返回(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

给出相同的结果。

4 个答案:

答案 0 :(得分:1)

最有可能Thread.sleep(5000 - (System.currentTimeMillis() - start_time)); 是参数匹配器(testDateArg.Is

异常消息告诉你只是使用参数匹配器作为成员调用参数,而不是返回值,但是你正在使用它作为返回值......

  

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

尝试

Arg.Any

参考NSubstitute: Argument matchers

答案 1 :(得分:1)

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

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

删除这段意外的代码 Arg.Any<int>() 是解决方案。

答案 2 :(得分:0)

这可能是由于早期测试存在问题。有关追踪此问题的一些步骤,请参阅this answer。我已经在下面提供了该答案的快照:

  

这最像是由于之前使用参数匹配器的测试   针对非虚方法或返回语句。

     

不幸的是,调试起来非常棘手。第一步是看   如果在此灯具中运行所有测试时出现问题。如果   因此,检查Arg.Is的所有用途|任何在该夹具中,从   在测试失败之前运行的那个(如果你的测试   框架使用可预测的测试顺序,否则您需要查看   在测试日志中查看哪些测试进行了失败的测试。

     

如果没有使用该灯具,您需要查看   预先运行的灯具,以查看左侧arg匹配器的位置   来自(哪里。它很可能在失败的测试附近。

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

另请参阅:How not to use argument matchers

答案 3 :(得分:0)

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

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

  

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