代码之家  ›  专栏  ›  技术社区  ›  g t Omri Btian

MOQ和施工人员-测试初始化行为

  •  5
  • g t Omri Btian  · 技术社区  · 16 年前

    我希望能够使用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() !

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

    编辑: 为了更清楚地说明这一点,我在 方法1) 获取文件名并添加一些行为。我要编写的测试将是以下方面的工作版本:

    [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 回复  |  直到 15 年前
        1
  •  9
  •   Matt Mills    15 年前

    从里面往下走 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"));
    }