JustMock 同一界面的多个模拟



在我们的解决方案中,我们曾经有一个非常古老的JustMock版本。我们编写了大约 7000 个测试,有时会出现的一种模式是为所有测试用例设置某个接口的默认模拟,并在某些测试中"覆盖"该默认模拟。

这意味着在几百个测试中,我们创建一个模拟并排列它,然后创建另一个相同类型的模拟并排列它。然后我们会对第二个模拟做出断言。

几个月前,我们更新到当前版本,现在这些相同类型的多个模拟似乎不再起作用了。以以下示例为例。我创建了两个相同类型的模拟,并断言第二个模拟被调用一次。对于 2012 版的 JustMock,此测试失败,但对于更新的版本,它不会失败。

那么 JustMock 在做什么,阻止我进行多个相同类型的模拟并断言它们?为什么会这样做?

public interface IFoo
{
void Bar();
}
[TestClass]
public class UnitTest1
{
[TestMethod]
public void TestMethod1()
{
var bar = Mock.Create<IFoo>();
Mock.Arrange(() => bar.Bar()).OccursOnce();
var foo = Mock.Create<IFoo>();
Mock.Arrange(() => foo.Bar()).OccursOnce();
Mock.Assert(foo); // Succeeds in recent versions, fails in older versions as I would expect
//Mock.Assert(bar); // Would fail as expected
}
}

事实上,这似乎是以前版本的 JustMock 的回归。我已将其作为错误报告记录到 JustMock 反馈门户中。如果您想订阅状态更新,这里有一个链接:当有多个模拟的发生预期未得到满足时,模拟断言不会失败。 此问题已在 JustMock 2019.1.115.2 版本中修复。

我刚刚遇到了同样的问题!您可以使用Telerik.JustMock.Helpers扩展来修复它:

var bar = Mock.Create<IFoo>();
bar.Arrange(x => x.Bar()).OccursOnce();
var foo = Mock.Create<IFoo>();
foo.Arrange(x => x.Bar()).OccursOnce();

现在,JustMock不会在闭包中找到错误的实例,因为您直接将其指定给表达式。

最新更新