Visual Studio 2012假货 - 如何验证方法被调用?

时间:2012-09-04 18:33:34

标签: c# unit-testing visual-studio-2012 mocking moq

来自使用Moq,我习惯于将mocks设置为Verifiable。如您所知,当您希望确保被测试的代码实际上在依赖项上调用方法时,这很方便。

e.g。在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的Verifiable / Verify实现的行为。我在Stubs上找到了InstanceObserver属性,这听起来可能就像我想要的那样,但截至9/4/12没有文档,如果它是正确的话,我不清楚如何使用它。 / p>

任何人都可以指出我做正确的方向做Moq Verifiable / Verify with VS2012's Fakes?

- 9/5/12编辑 -
我意识到了这个问题的解决方案,但是我仍然想知道是否有一种内置方式来处理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结束编辑 -

2 个答案:

答案 0 :(得分:4)

由于我没有听到更好的解决方案,我现在称9/5/12的编辑是最好的方法。

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

答案 1 :(得分:0)

虽然在复杂场景中可能有意义,但您不必使用单独的(Arrangements)类来存储有关被调用方法的信息。这是一种更简单的方法,用于验证使用Fakes调用方法,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);
}