我有一个方法,我试图使用NSubstitute进行模拟:
Foo MyMethod(IEnumerable<string> args);
我希望该方法为new Foo { ID = 1 }
- 集合中只有一个名为args
的项目的调用返回"Item1"
。但是,当集合仅包含"Item2"
时,我想返回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语句。
所以我想要实现的是无论我们为方法提供什么样的集合类型,模拟应该只对集合项进行区分。
答案 0 :(得分:3)
您可以使用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/