MSTest を使用して、[TestInitialize]
メソッド内から現在のテストの名前を取得する必要がありました。これはプロパティから取得できTestContext.TestName
ます。
TestContext
メソッドに渡された static と[ClassInitialize]
、パブリック プロパティとして宣言された (そしてテスト ランナーによって設定された) static の動作に予期しない違いがあることがわかりました。
次のコードを検討してください。
using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
namespace TestContext.Tests
{
[TestClass]
public class UnitTest1
{
public TestContext TestContext { get; set; }
private static TestContext _testContext;
[ClassInitialize]
public static void SetupTests(TestContext testContext)
{
_testContext = testContext;
}
[TestInitialize]
public void SetupTest()
{
Console.WriteLine(
"TestContext.TestName='{0}' static _testContext.TestName='{1}'",
TestContext.TestName,
_testContext.TestName);
}
[TestMethod] public void TestMethod1() { Assert.IsTrue(true); }
[TestMethod] public void TestMethod2() { Assert.IsTrue(true); }
[TestMethod] public void TestMethod3() { Assert.IsTrue(true); }
}
}
これにより、以下が出力されます (VS2013 の Resharper テスト ランナー出力からコピーして貼り付けます)。
TestContext.TestName='TestMethod1' static _testContext.TestName='TestMethod1'
TestContext.TestName='TestMethod2' static _testContext.TestName='TestMethod1'
TestContext.TestName='TestMethod3' static _testContext.TestName='TestMethod1'
以前は の 2 つのインスタンスTestContext
が同等であると想定していましたが、明らかにそうではありません。
public TestContext
プロパティは期待どおりに動作します- メソッドに渡される
private static TestContext
値は渡され[ClassInitialize]
ません。現在実行中のテストに関連するプロパティがあるためTestContext
、この実装は誤解を招き、壊れているようです
TestContext
メソッドに渡されたものを実際に使用することを好むシナリオはありますか[ClassInitialize]
、それとも無視して使用しないのが最善ですか?