Moq和构造函数 - 测试初始化​​行为

时间:2010-09-08 12:36:28

标签: c# unit-testing constructor mocking moq

我希望能够使用Moq正确测试类的初始化:

class ClassToTest
{
    public ClassToTest()
    {
        Method1(@"C:\myfile.dat")
    }

    public virtual void Method1(string filename)
    {
        // mock this method
        File.Create(filename);
    }
}

我以为我可以使用CallBase属性创建类的可测试版本,然后使用.Setup()确保Method1()不执行任何代码。

但是,创建Mock<ClassToTest>()并不会调用构造函数,如果是,那么执行Setup()已经太晚了!

如果这是不可能的,那么在确保构造函数正确运行的同时解决问题的最佳方法是什么?

编辑:为了更清楚,我在Method1()添加了一个参数来获取文件名并添加了一些行为。我想写的测试将是以下的工作版本:

[Test]
public void ClassToTest_ShouldCreateFileOnInitialisation()
{
    Mock<ClassToTest> mockClass = new Mock<ClassToTest>() { CallBase = true };
    mockClass.Setup(x => x.Method1(It.IsAny<string>());

    mockClass.Verify(x => x.Method1(@"C:\myfile.dat"));
}

1 个答案:

答案 0 :(得分:9)

Moq.Mock内部(实际上在CastleProxyFactory使用的Moq内)

mockClass.Object

将通过Activator.CreateInstance()

调用构造函数

所以你的测试看起来像

[Test]
public void ClassToTest_ShouldCreateFileOnInitialisation()
{
    Mock<ClassToTest> mockClass = new Mock<ClassToTest>();
    mockClass.Setup(x => x.Method1(It.IsAny<string>());

    var o = mockClass.Object;

    mockClass.Verify(x => x.Method1(@"C:\myfile.dat"));
}