【问题标题】:Visual Studio 2012 Fakes - How do I verify a method was called?Visual Studio 2012 Fakes - 如何验证方法是否被调用?
【发布时间】:2012-09-04 18:33:34
【问题描述】:

由于使用 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 结束编辑--

【问题讨论】:

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


【解决方案1】:

由于我没有听说过更好的解决方案,我将 2012 年 9 月 5 日的修改称为目前最好的方法。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2011-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-31
      • 1970-01-01
      相关资源
      最近更新 更多