web-dev-qa-db-ja.com

呼び出されていないユニットテストベースのクラスのClassInitialize属性

これらのメソッドをTestBaseクラスに追加しました:

_[ClassInitialize]
public static void InitializBeforeAllTests()
{
}
_

しかし、デバッグで単体テストを実行すると、Test1()

_[TestClass]
public class TestMapping : TestBase
{
    [TestMethod]
    public void Test1()
    {
    }
_

TestBase.InitializBeforeAllTests()メソッドが呼び出されることはありません。どうして?

43
Phil

メソッドのClassInitialize属性を宣言するとき、メソッドは静的、パブリック、ボイドである必要があり、タイプTestContextの単一のパラメーターを受け取る必要があります。

同じユニットテストでAssemblyInitialize属性を持つ他のメソッドも使用している場合、テストは実行されますが、すべてのテストメソッドがスキップされ、AssemblyCleanupに直接移動するか、単に終了します。

MSDNのClassInitialize属性 の例を試してください。

13
Shaulian

基本クラスでアセンブリ初期化メソッドを設定できます。 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
}
8
James Lawruk

何らかの理由で、ユニットテストフレームワークのUnitTestExecuterでは、テストクラスごとに1つのClassInitializeメソッドと1つのClassCleanupメソッドのみを定義できます。派生テストクラスと基本テストクラスの両方で呼び出されるTestInitializeメソッドとTestCleanupメソッドとは異なります...

8
Paul Killick

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
    }
}
0

私の場合、[Ignore]属性を適用しました(テストは手動で実行されます)
これにより、[AssemblyInitialize]が呼び出されなくなりました

[Ignore]属性を削除した場合、期待どおりに[AssemblyInitialize]が呼び出されました。

奇妙なことに、テストに[AssemblyCleanup]を適用してもしなくても、[Ignore]が呼び出されます

0
Branden Barber