これらのメソッドをTestBaseクラスに追加しました:
_[ClassInitialize]
public static void InitializBeforeAllTests()
{
}
_
しかし、デバッグで単体テストを実行すると、Test1()
:
_[TestClass]
public class TestMapping : TestBase
{
[TestMethod]
public void Test1()
{
}
_
TestBase.InitializBeforeAllTests()
メソッドが呼び出されることはありません。どうして?
メソッドのClassInitialize属性を宣言するとき、メソッドは静的、パブリック、ボイドである必要があり、タイプTestContextの単一のパラメーターを受け取る必要があります。
同じユニットテストでAssemblyInitialize属性を持つ他のメソッドも使用している場合、テストは実行されますが、すべてのテストメソッドがスキップされ、AssemblyCleanupに直接移動するか、単に終了します。
MSDNのClassInitialize属性 の例を試してください。
基本クラスでアセンブリ初期化メソッドを設定できます。 ClassInitializeとまったく同じではありませんが、実行可能なオプションです。出典: ここで言及されている回避策
[TestClass]
public abstract class TestBase
{
[AssemblyInitializeAttribute]
public static void Initialize(TestContext context)
{
// put your initialize code here
}
}
Cleanupメソッドを追加することもできます。
[AssemblyCleanup]
public static void Cleanup()
{
//clean up stuff here
}
何らかの理由で、ユニットテストフレームワークのUnitTestExecuterでは、テストクラスごとに1つのClassInitializeメソッドと1つのClassCleanupメソッドのみを定義できます。派生テストクラスと基本テストクラスの両方で呼び出されるTestInitializeメソッドとTestCleanupメソッドとは異なります...
MSリンクはもう機能していません。とにかく、この問題を回避する1つの方法は、初期化コードを基本クラスのコンストラクターに移動することです。これにより、インスタンス化されるたびに、子孫クラスから確実に呼び出されます。
[TestClass]
public class TestBase
{
public TestBase()
{
// Initialization Code
}
}
[TestClass]
public class TestMapping : TestBase
{
[TestMethod]
public void Test1()
{
// At this point the base constructor should have been called
}
}
私の場合、[Ignore]
属性を適用しました(テストは手動で実行されます)
これにより、[AssemblyInitialize]
が呼び出されなくなりました
[Ignore]
属性を削除した場合、期待どおりに[AssemblyInitialize]
が呼び出されました。
奇妙なことに、テストに[AssemblyCleanup]
を適用してもしなくても、[Ignore]
が呼び出されます