我希望能够使用 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/