2017-02-22 7 views
0

テストスイートを実行する際に問題が発生した場合(ReSharperを使用)、複数のテストクラスを一緒に実行すると静的な結果セットのように見えますが、走る本質的に構造は、次のようになります。MSTestの "Shared"テストセットアップ(ClassInitialize)をベースクラスの継承を使用して

public class TestBase 
{ 
    protected static Sum Target; 

    protected static void Init(int a, int b) 
    { 
     Target = new Sum(a, b); 
    } 
} 

[TestClass] 
public class TestClass1 : TestBase 
{ 
    [ClassInitialize] 
    public static void Setup(TestContext context) { Init(1, 2); } 

    [TestMethod] 
    public void Test() 
    { 
     Assert.AreEqual(3, Target.Result); 
    }  
    ... // plus around 20 tests 
} 

[TestClass] 
public class TestClass2 : TestBase 
{ 
    [ClassInitialize] 
    public static void Setup(TestContext context) { Init(3, 4); } 

    [TestMethod] 
    public void Test() 
    { 
     Assert.AreEqual(7, Target.Result); // failed. Expected:<7>. Actual:<3> 
    } 
    ... // plus around 20 tests 
} 

私は私が約20ユニットテストを持っていると仮定すると、これは静的変数の私の貧弱な使用法によるものであり、このより良いを構造化する方法上の任意の良い提案を鑑賞う理解します各テストクラスとテストの設定は、上の図よりも複雑です。

+1

この問題は、静的変数の使用法やデザインが悪いために起こっていることを理解していますが、問題を解決することはできず、代わりに症状を回避する方法が必要です。あまり他のことを示唆することはできません。これがOOPと静的変数の性質です。あなたのご意見ありがとうございます。 – Nkosi

+0

私は実際には、NUnitの非静的な 'OneTimeSetUp'に似た回避策を期待していました。 – Tsar

+0

これは、' TestInitialize'属性が! – toadflakz

答えて

1

staticを削除し、ClassInitializeTestInitializeに変更して簡単に解決できます。 staticを削除

public class TestBase 
{ 
    protected Sum Target; 

    protected void Init(int a, int b) 
    { 
     Target = new Sum(a, b); 
    } 
} 

はTest1のとTest2をクラス定義へのローカルTargetフィールドになります。 ClassInitializeTestInitializeに変更すると、の値は、クラスが最初にインスタンス化されるのではなく、それぞれが実行される前にリフレッシュされます。

+0

実用的ではありません。編集を参照してください – Tsar

関連する問題