在ClassCleanup中访问CurrentTestOutcome?

时间:2013-03-21 11:36:40

标签: c# unit-testing

使用C#4.0。我有一个单元测试,我需要创建一个临时数据库。这是在类初始化期间完成的:

[ClassInitialize()]
public static void MyClassInitialize(TestContext testContext)
{
    // Create database!
}

[ClassCleanup()]
public static void MyClassCleanup()
{
    // Remove database IF CurrentTestOutcome == UnitTestOutcome.Passed
}

问:如何阅读CurrentTestOutcome方法中的ClassCleanup值?

2 个答案:

答案 0 :(得分:3)

我建议您创建一个静态标志,您可以从MyClassCleanup访问该标志,并在出现错误时在测试清理期间设置它。您班上的内容如下:

[TestClass]
public class MyTests {
    static bool _testFailed;

    [ClassInitialize()]
    public static void MyClassInitialize(TestContext testContext)
    {
        // Create database!
        _testFailed = false;
    }

    [ClassCleanup()]
    public static void MyClassCleanup()
    {
        if(_testFailed == false) {
        // Remove database IF CurrentTestOutcome == UnitTestOutcome.Passed
        }
    }

    [TestCleanup()]
    public void MyTestCleanup() {
        if (TestContext.CurrentTestOutcome != UnitTestOutcome.Passed) {
            _testFailed = true;
        }
    }

    public TestContext TestContext { get; set; }

}

我建议采用上述方法,因为我的理解是,在你的课堂清理中,引用CurrentTestOutcome从那时起就不会有太大的影响。它只包含要运行的最后一个测试的状态,而不是该类中所有测试的综合结果。

答案 1 :(得分:1)

我正在考虑以下解决方案。不确定这是否被视为良好做法。

private static IList<TestContext> testResults;

public TestContext TestContext
{
    get
    {
        return testContext;
    }
    set
    {
        testContext = value;

        testResults.Add(testContext);
    }
}

[ClassInitialize()]
public static void MyClassInitialize(TestContext testContext)
{
    testResults = new List<TestContext>();
}

[ClassCleanup()]
public static void MyClassCleanup()
{
    if (testResults.All(t => t.CurrentTestOutcome == UnitTestOutcome.Passed ||
        t.CurrentTestOutcome == UnitTestOutcome.Inconclusive))
    {
        // Perform conditional cleanup!
    }
}