C# NSSubstitute错误未预料的ArgumentMatcherException

C# NSSubstitute错误未预料的ArgumentMatcherException,c#,mocking,nsubstitute,C#,Mocking,Nsubstitute,我得到以下错误: NSSubstitute.Exceptions.UnexpectedArgumentMatcherException:'参数 匹配器(Arg.Is、Arg.Any)只能用于替换成员 论据。不要在Returns()语句或其他任何地方使用 在会员电话之外。正确使用: sub.MyMethod(Arg.Any())。返回(“hi”)不正确的用法: sub.MyMethod(“hi”).返回(Arg.Any())' 尝试模拟以下界面时: public interface IMyDate

我得到以下错误:

NSSubstitute.Exceptions.UnexpectedArgumentMatcherException:'参数 匹配器(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();
myDate.GetDate().Returns(testDate);//此处抛出错误
谁能解释一下我做错了什么

var myDate = Substitute.For<IMyDate>();
myDate.GetDate().Returns(new DateTime(2018, 04, 05)); // Error thrown here
var myDate=Substitute.For();
myDate.GetDate()返回(新的日期时间(2018年4月5日));//此处抛出错误

给出相同的结果。

最有可能的
testDate
是参数匹配器(
Arg.is
Arg.Any

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

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

试一试


var testDate=new DateTime()// 这可能是由于早期测试的问题造成的。有关跟踪此问题的一些步骤,请参阅。我在下面列出了该答案的快照:

这与之前使用参数匹配器进行的测试最为相似 针对非虚方法,或在Returns语句中

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

如果该夹具没有出现这种情况,则需要查看 预先运行以查看剩余arg匹配器位置的装置 来自。它很可能在测试失败的附近

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


另请参见:。

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

将该方法虚拟化可以解决此问题

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


它给出了相同的结果。请参阅我问题中的更新。@qwerty我非常怀疑错误是否会相同。抛出的新错误是什么?我刚刚在本地测试了它,它工作正常,正如@NKosi所说的,可能是另一个错误。不知道该告诉你什么-是同一个错误。testDate之前已经是一个硬编码的日期。这很奇怪,请确保重新编译工作正常,并且您不会得到一些源代码不同的旧二进制文件
var testDate = new DateTime(); //<-- try setting the desired date as needed
var myDate = Substitute.For<IMyDate>();
myDate.GetDate().Returns(testDate);