Mock Stub 和 Moq Setup 的行为不同? Moq 中 Stub 的等价物是什么?

Mock Stub and Moq Setup act differently ? What is the equivalent of Stub in Moq?

我在两个不同的项目中编写单元测试时意识到,Moq 中的设置行为不同于 Rhino-Mocks 中的存根。

一个 class 使用 Mock,它具有我存根的这些场景之一

for (int i=0; i<ObjectAList.Count; i++)
{
     _translator.Stub(x => x.TranslateToObjectB(ObjectAList[i])).Return(ObjectBList[i]);
}

上面的例子很有魅力。

但是,当我尝试在另一个使用 Moq 的项目中使用安装程序做同样的事情时,它失败了。

for (int i=0; i<ObjectAList.Count; i++)
{
     _translator.SetUp(x => x.TranslateToObjectB(ObjectAList[i])).Returns(ObjectBList[i]);
}

相反,我不得不做这样的事情,

int i = 0;
foreach (var ObjectA in ObjectAList)
{
     _translator.Setup(x => x.ConvertToProcessingFilter(ObjectA)).Returns(ObjectBList[i]);
     i++;
}

我只是在寻找存根与安装程序表现如此不同的原因。如果这是设置的预期结果,那么 Moq 中存根的等价物是什么?

你所看到的,与有关。

有:

for (int i=0; i<ObjectAList.Count; i++)
{
     _translator.Setup(x => x.TranslateToObjectB(ObjectAList[i])).Returns(ObjectBList[i]);
}

您正在关闭(捕获) for 迭代变量。该行为将取决于何时 模拟框架评估 lambda 表达式。

尝试:

for (int i=0; i<ObjectAList.Count; i++)
{
     var j = i;
     _translator.Setup(x => x.TranslateToObjectB(ObjectAList[j])).Returns(ObjectBList[j]);
}

相反。会成功吗?

您也可以只进行一种设置,类似于此:

_translator.Setup(x => x.TranslateToObjectB(It.IsAny<ObjAType>()))
  .Returns((ObjAType a) => ObjectBList[ObjectAList.IndexOf(a)]);