3

使用 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

4

2 回答 2

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从那时起,引用并不会真正产生多大影响。它只包含要运行的最后一个测试的状态,而不是类中所有测试的组合结果。

于 2015-05-28T15:21:52.780 回答
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!
    }
}
于 2015-05-28T16:11:20.973 回答