假设我有一个类似于此的标准设置:
mock.Setup(myObj => myObj.MyMethod(It.Is<MyT>(item => IsTrue(item)))).Returns(someList)
是否可以在单独的代码行中识别完全相同的Setup
(使用相同的It.Is
条件模拟相同的方法),然后修改Returns
?例如,假设在一个条件下我希望MyMethod
返回列表{0,1,2},然后我确定在相同条件下我也想返回{3,4,5}。由于代码的结构方式,我不知道{3,4,5}先验,所以我不能在初始设置中使用它。
答案 0 :(得分:3)
你可以将委托传递给像这样的退货:
mock.Setup(myObj => myObj.MyMethod(It.Is<MyT>(item => IsTrue(item)))).Returns(item => (condition) ? list1 : list2)
答案 1 :(得分:1)
你可以这样做:
var someList = new List<int> { 0, 1, 2, };
mock.Setup(myObj => myObj.MyMethod(It.Is<MyT>(item => IsTrue(item))))
.Returns(someList);
// use 'mock' first time(s)
someList.Clear(); // if wanted
someList.AddRange(new[] { 3, 4, 5, });
// use 'mock' additional time(s)
这是有效的,因为List<>
是引用类型。 Moq只记得对List<>
对象所在位置的引用。如果你改变List<>
对象(不改变对new List<int>
的引用!),那很好。
另一方面,如果要更改对不同对象(另一个实例)的引用,请使用lambda(几乎与Spritely的答案一样):
var someList = new List<int> { 0, 1, 2, };
mock.Setup(myObj => myObj.MyMethod(It.Is<MyT>(item => IsTrue(item))))
.Returns(() => someList);
// use 'mock' first time(s)
someList = new List<int> { 3, 4, 5, };
// use 'mock' additional time(s)
在我的第二个解决方案中,请遵循箭头 () => someList
。