JustMock 同一个接口的多个 Mock

JustMock multiple Mocks of same interface

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

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

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

那么 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 反馈门户中。如果您想订阅状态更新,请点击 link:Mock assert doesn't fail when there are multiple mocks with occurrence expectations that are not satisfied。 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 在闭包中查找错误的实例不会出错,因为您直接将其指定给表达式。