g t*_*g t 5 c# constructor unit-testing moq mocking
我希望能够使用Moq正确测试类的初始化:
class ClassToTest
{
public ClassToTest()
{
Method1(@"C:\myfile.dat")
}
public virtual void Method1(string filename)
{
// mock this method
File.Create(filename);
}
}
Run Code Online (Sandbox Code Playgroud)
我以为我可以使用该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"));
}
Run Code Online (Sandbox Code Playgroud)
这样下来的内部Moq.Mock(其实里面CastleProxyFactory是Moq用)
mockClass.Object
Run Code Online (Sandbox Code Playgroud)
将通过以下方式调用构造函数 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"));
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6073 次 |
| 最近记录: |