来自使用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结束编辑 -
答案 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);
}