3

C#4.0を使用します。一時データベースを作成する必要がある単体テストがあります。これは、クラスの初期化中に行われます。

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

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

Q:メソッド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 に答える