6

由于使用 Moq,我习惯于将模拟设置为可验证。如您所知,当您想确保被测代码实际调用依赖项上的方法时,这很方便。

例如起订量:

// Set up the Moq mock to be verified
mockDependency.Setup(x => x.SomethingImportantToKnow()).Verifiable("Darn, this did not get called.");
target = new ClassUnderTest(mockDependency);
// Act on the object under test, using the mock dependency
target.DoThingsThatShouldUseTheDependency();
// Verify the mock was called.
mockDependency.Verify();

我一直在使用 VS2012 的“Fakes Framework”(因为不知道它的更好名称),它非常漂亮,我开始更喜欢它而不是 Moq,因为它看起来更有表现力并且使 Shims 变得容易。但是,我无法弄清楚如何重现类似于 Moq 的可验证/验证实现的行为。我在 Stubs 上找到了 InstanceObserver 属性,这听起来可能是我想要的,但截至 2012 年 9 月 4 日还没有文档,而且我不清楚如何使用它,如果它是正确的。

任何人都可以为我指出正确的方向,比如使用 VS2012 的 Fakes 进行 Moq Verifiable/Verify 之类的事情吗?

-- 2012 年 9 月 5 日编辑 --
我意识到了问题的解决方案,但我仍然想知道是否有内置方法可以使用 VS2012 Fakes 来解决这个问题。如果可以的话,我会让这个开放一段时间,让有人声称。这是我的基本想法(如果没有编译,请道歉)。

[TestClass]
public class ClassUnderTestTests
{
    private class Arrangements
    {
        public ClassUnderTest Target;
        public bool SomethingImportantToKnowWasCalled = false;  // Create a flag!
        public Arrangements()
        {
            var mockDependency = new Fakes.StubIDependency  // Fakes sweetness.
            {
                SomethingImportantToKnow = () => { SomethingImportantToKnowWasCalled = true; }  // Set the flag!
            }
            Target = new ClassUnderTest(mockDependency);
        }
    }

    [TestMethod]
    public void DoThingThatShouldUseTheDependency_Condition_Result()
    {
        // arrange
        var arrangements = new Arrangements();
        // act
        arrangements.Target.DoThingThatShouldUseTheDependency();
        // assert
        Assert.IsTrue(arrangements.SomethingImportantToKnowWasCalled);  // Voila!
    }
}

-- 9/5/12 结束编辑 --

4

2 回答 2

4

由于我没有听到更好的解决方案,我将 9/5/12 的编辑称为目前最好的方法。

编辑 找到描述最佳实践的神奇文章。http://www.peterprovost.org/blog/2012/11/29/visual-studio-2012-fakes-part-3/

于 2012-09-10T18:10:19.057 回答
1

尽管它在复杂场景中可能有意义,但您不必使用单独的 (Arrangements) 类来存储有关被调用方法的信息。这是验证是否使用 Fakes 调用方法的更简单方法,它将信息存储在局部变量中,而不是单独类的字段中。像您的示例一样,它暗示 ClassUnderTest 调用 IDependency 接口的方法。

[TestMethod]
public void DoThingThatShouldUseTheDependency_Condition_Result()
{
    // arrange
    bool dependencyCalled = false;
    var dependency = new Fakes.StubIDependency()
    {
        DoStuff = () => dependencyCalled = true;
    }
    var target = new ClassUnderTest(dependency);

    // act
    target.DoStuff();

    // assert
    Assert.IsTrue(dependencyCalled);
}
于 2012-10-26T17:56:47.433 回答