模拟存根和Moq设置的行为有所不同? Moq中的Stub等于什么?

时间:2018-12-13 03:48:58

标签: c# unit-testing moq rhino-mocks

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

一个类使用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中的存根等于什么?

1 个答案:

答案 0 :(得分:0)

您看到的与Closures behaving differently in for and foreach loops有关。

使用:

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)]);