c# - 最小起订量和构造函数 - 测试初始化​​行为

标签 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()
{
    var mockClass = new Mock<ClassToTest>() { CallBase = true };
    mockClass.Setup(x => x.Method1(It.IsAny<string>());

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

最佳答案

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

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"));
}

关于c# - 最小起订量和构造函数 - 测试初始化​​行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3667774/

相关文章:

javascript - 在被测试的方法中模拟一个函数

c# - 采用构造函数的方法参数

C# 停止类序列化

c# - 如何在 C# 中清除 errno?

c# - 通缉 : DateTime. TryNew(year, month, day) or DateTime.IsValidDate(year, month, day)

c# - 从我的 ASPX 页面调用 C# 类

ios - 在 Xcode 中测试异步方法

php - 如何让我的 PHPUnit 测试更简洁、更短?

go - 在 Go 中实现构造函数/init 方法的最佳方法是什么

c++ - 初始化非指针类成员