修改现有安装程序的返回

时间:2015-02-12 12:55:44

标签: moq

假设我有一个类似于此的标准设置:

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}先验,所以我不能在初始设置中使用它。

2 个答案:

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