如何从单元测试中跳过构造函数调用?

时间:2017-06-01 09:10:58

标签: c# unit-testing

我正在为类方法“Execute”执行单元测试,但不想执行类构造函数代码。

有没有办法从单元测试执行中跳过构造函数代码调用?

类代码,

public class DemoCls
{
    public DemoCls()
    {
        string ConfigFolderPath = Path.Combine(Environment.CurrentDirectory, @"\Config");
        //string dataFolder = @"C:\Data1";
        foreach (string X in Directory.EnumerateFiles(ConfigFolderPath, "test" + "*.xml"))
        {
        }
    }

    public void Execute()
    {

    }
}

单元测试代码,

[TestClass()]
public class DemoClsTests
{
    [TestMethod()]
    public void ExecuteTest()
    {
        var X = new DemoCls();
        X.Execute();
    }
}

4 个答案:

答案 0 :(得分:5)

重写课程,有两种方法之一:

  1. 使用接口将信息传递给构造函数(可以在单元测试中模拟)

    cadvisor
  2. 从构造函数中删除配置代码,并将其放在另一个函数中。

    cadvisor2
  3. 接口更适合单元测试。

答案 1 :(得分:3)

"有没有办法从单元测试执行中跳过构造函数代码调用?"

答案是:否(例如方法)

答案 2 :(得分:0)

您可以将ctor代码包装在“if”预处理程序指令中,并仅在非测试运行期间有条件地执行它。

#define DEBUG  
// ...  
#if DEBUG  
    Console.WriteLine("Debug version");  
#endif  

https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/preprocessor-directives/preprocessor-if

答案 3 :(得分:0)

你可以使用单元测试框架,它允许你模拟具体的类,以便伪造没有接口的类,例如我使用Typemock Isolator,我可以模拟几乎任何类,并决定什么是发生在所有班级成员及其构造者身上。 这是对您在问题中所使用的课程的测试:

[TestMethod,Isolated]
public void TestMethod()
{
    var fake = Isolate.Fake.Instance<DemoCls>(Members.CallOriginal, ConstructorWillBe.Ignored);
    fake.Execute();

    Isolate.Verify.WasCalledWithAnyArguments(() => fake.Execute());
}