Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Moq和施工人员-测试初始化行为_C#_Unit Testing_Constructor_Mocking_Moq - Fatal编程技术网

C# 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

我希望能够使用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()
不会调用构造函数,如果调用了构造函数,那么执行
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"));
}