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

时间:2016-12-21 13:05:44

标签: c# unit-testing nsubstitute

我有一个方法,我试图使用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语句。

所以我想要实现的是无论我们为方法提供什么样的集合类型,模拟应该只对集合项进行区分。

1 个答案:

答案 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/