在两个不同的项目中编写单元测试时,我意识到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中的存根等于什么?
答案 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)]);