当参数不完全匹配时模拟成员调用

Mock member-call when parameters do not match exactly

我有一个尝试使用 NSubstitute 模拟的方法:

Foo MyMethod(IEnumerable<string> args);

我希望方法 return new Foo { ID = 1 } 进行调用,其中 args 集合只有一个名为 "Item1" 的项目。但是,当集合仅包含 "Item2" 时,我想 return Foo.

的另一个实例

所以我写了这段代码:

var mock = Substitute.For<MyType>();
mock.MyMethod(new[] { "Item1" }).Returns(new Foo { ID = 1 });
mock.MyMethod(new[] { "Item2" }).Returns(new Foo { ID = 2 });

在我的调用代码中,我有这样的东西:

var foo = myType.MyMethod(new[] { "Item1" });

但是,当使用引用相等性比较数组时,不会执行模拟。因此,由于我有 string[] 的两个实例 共享相同的值 它们被认为是不相等的,因此我们不会跳到模拟return-声明。

所以我想要实现的是,无论我们向方法提供什么确切类型的集合,模拟都应该只区分集合项。

您可以使用 Arg.Is 语法自行检查:

mock.MyMethod(Arg.Is<string[]>(a => a.Contains("Item1"))).Returns(new Foo { ID = 1 });
mock.MyMethod(Arg.Is<string[]>(a => a.Contains("Item2"))).Returns(new Foo { ID = 2 });

查看此处了解更多信息:http://nsubstitute.github.io/help/return-for-args/