我收到以下错误:
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
给出相同的结果。
答案 0 :(得分:1)
最有可能Thread.sleep(5000 - (System.currentTimeMillis() - start_time));
是参数匹配器(testDate
或Arg.Is
)
异常消息告诉你只是使用参数匹配器作为成员调用参数,而不是返回值,但是你正在使用它作为返回值......
“不要在Returns()语句或成员调用之外的任何其他地方使用”
尝试
Arg.Any
答案 1 :(得分:1)
在我们的示例中,随机测试发送了此错误消息,但仅在运行所有测试时才发送。我们在从 4.6.1 迁移到 netcore 3.1 时发现了这个错误。
问题是没有任何替代品的测试类使用了 Arg.Any<int>()
表达式,原因不明。
删除这段意外的代码 Arg.Any<int>()
是解决方案。
答案 2 :(得分:0)
这可能是由于早期测试存在问题。有关追踪此问题的一些步骤,请参阅this answer。我已经在下面提供了该答案的快照:
这最像是由于之前使用参数匹配器的测试 针对非虚方法或返回语句。
不幸的是,调试起来非常棘手。第一步是看 如果在此灯具中运行所有测试时出现问题。如果 因此,检查Arg.Is的所有用途|任何在该夹具中,从 在测试失败之前运行的那个(如果你的测试 框架使用可预测的测试顺序,否则您需要查看 在测试日志中查看哪些测试进行了失败的测试。
如果没有使用该灯具,您需要查看 预先运行的灯具,以查看左侧arg匹配器的位置 来自(哪里。它很可能在失败的测试附近。
希望这会有所帮助。在正面新闻中,下一个NSubstitute版本(v4)将在这些情况下提供更多帮助。
答案 3 :(得分:0)
要解决此问题,您需要确定导致该问题的方法,这可以是您尝试调用的方法,也可以是您尝试调用的方法内的另一个嵌套方法...
将该方法设为虚拟可解决此问题。
如果您用类而不是接口代替,请检查对替代对象的调用是否在虚拟/抽象成员上。 无法为非虚拟/非抽象成员配置返回值。