当参数不完全匹配时模拟成员调用
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/
我有一个尝试使用 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/