C# Moq和施工人员-测试初始化行为
我希望能够使用Moq测试类的正确初始化:C# Moq和施工人员-测试初始化行为,c#,unit-testing,constructor,mocking,moq,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); } } 我想我可以使用CallBas
class ClassToTest
{
public ClassToTest()
{
Method1(@"C:\myfile.dat")
}
public virtual void Method1(string filename)
{
// mock this method
File.Create(filename);
}
}
我想我可以使用CallBase
属性创建该类的可测试版本,然后使用.Setup()
确保Method1()
不执行任何代码
但是,创建Mock()
不会调用构造函数,如果调用了构造函数,那么执行Setup()
就太晚了
如果这是不可能的,那么在确保构造函数正确运行的同时,解决问题的最佳方法是什么
EDIT:为了更清楚,我在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"));
}
[测试]
public void ClassToTest\u应创建文件初始化()
{
Mock mockClass=new Mock(){CallBase=true};
mockClass.Setup(x=>x.Method1(It.IsAny());
验证(x=>x.Method1(@“C:\myfile.dat”);
}
在Moq.Mock
内部(实际上在Moq
使用的CastleProxyFactory
内部)
将通过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"));
}
[测试]
public void ClassToTest\u应创建文件初始化()
{
Mock mockClass=new Mock();
mockClass.Setup(x=>x.Method1(It.IsAny());
var o=mockClass.Object;
验证(x=>x.Method1(@“C:\myfile.dat”);
}
在您开始这一过程之前,请仔细研究您的设计实践。不建议在构造函数中调用虚拟方法,因为它可能会导致难以跟踪的非常微妙的错误。有关详细信息,请参阅。Method1()是什么这样做你需要模拟吗?如果可以,不要在构造函数中调用虚拟方法。如果不能,请粘贴你的测试。我只声明虚拟方法是为了以后模拟它。如果这是错误的,那么我将不得不使用另一种方法…我添加了一个示例,这可能有助于澄清我正在尝试做的事情。
[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"));
}