2012-04-11 8 views
2

私はクラスをテストしていますが、これは他のクラスからかなりの依存関係があります。これを解決するために私はモックを使います。これまでのところうまくいきました。はユニットテストのアプローチが悪いですか?

[Test] 
public void DataField_Gets_Properly_Created() 
{ 
    // Arrange all those mocks 

    _dataField = new DataField(dependency1, dependency2, dependency3); 

    Assert.NotNull(dataField.Id); 
    // other assertions ... 
} 

[Test] 
public void DataField_Gets_Properly_Saved() 
{ 
    var entityList = new List<IEntity>(); 
    var dfId = Guid.NewGuid(); 

    _dataField.SetValue(true, entityList, dfId); 

    Assert.True(_datenFeld.ValueBoolean); 
    // other assertions 
} 

ご覧のとおり、この専用の_dataField変数を使用します。ご存じのように、私は実際に、最初のテストでデータフィールドを作成できるかどうかをテストします。最初の方法で作成した2番目のテストで同じデータフィールドを使用するのは悪い方法ですか?私はこれが非常にクリーンなコードではないと思います。

私が持っていた2番目のアイデアは、このデータフィールドを[Setup]に作成することでした。これは非常にきれいではありません。なぜなら、それが作成されたとしても、後でセットアップやテストで作成する必要があるからです。よくわかりません。

その後、実際のクラスをテストするためにデータフィールドのインスタンスが必要なさらに多くのテストが行​​われる可能性があります。DataField

+4

テストは互いに独立している必要があります。 1つのテストの実行は、他のテストの実行に影響してはなりません。 – Bernard

+0

唯一の方法はセットアップでしょうか?しかし、最初のテストではセットアップの作成がうまくいっているかどうかをテストしました。最初のテストでは、インスタンス化されるデータフィールドに「必要な」フィールドが設定されているかどうかをテストします。 –

答えて

4

ユニットテストは、他のユニットテストに依存すべきではありません。それぞれを個別に実行してパスする必要があり、任意の順序で実行できるはずです。

この場合、各テストで再初期化するローカル変数を使用することをお勧めしますが、すべてのモックは[Setup]に配置してください。初期化はヘルパーメソッドCreateDataFieldForTest()などでカプセル化できます。

+0

この再初期化は私にとって良いことです。私は '[TestFixtureSetup]'のモック作成を入れ子にしたほうがいいと思っていますね。 –

+0

'[Setup]'はより分離されていますが、状況によっても異なります。 –

+0

「より孤立した」とはどういう意味ですか? –

3

あなたのユニットテストは、他のユニットテストに依存すべきではありません。

[Setup]の機能は、より前に呼び出され、[Test]がクラス内で機能します。したがって、_dataFieldの作成を[Setup]に移動すると、それは継続的に再作成されます。それはあなたが確信していることですか?

[TestFixtureSetUp]と表示されている機能は、[TestFixure]の先頭で一度呼び出されます。だから、その適切に「初期化」ではない場合はここで最初のテストは失敗しますすべての[Test]

[SetUp] 
public void TestSetup() 
{ 
    _dataField = new DataField(dependency1, dependency2, dependency3); 
} 

[Test] 
public void DataField_Gets_Properly_Created() 
{ 
    Assert.NotNull(dataField.Id); 
    // other assertions ... 
} 

[Test] 
public void Most_Test_Using_dataField() 
{ 
    ... 
} 

前に呼び出すことが文句を言いません。この場合、問題があることを知り、他のテストがうまくいくことを保証することはできません。

+0

私はこれが起こることを知っています。最初のテストは、 'new DataField(d1、d2、...)'がデータフィールドを適切に初期化したかどうかをテストするだけです。だから、 '[Setup] 'で作成されたデータフィールドが正しく初期化されているかどうかテストしなければならないでしょう。それは私にはかなり汚れているようです。 –

+0

@ebeeb - 私は汚れているとは思わない。そこに初期化があるだけであれば問題ありません。最初のテストでオブジェクトが有効であることを確認してください。私は例を更新しました。 – SwDevMan81

+0

つまり、最初のテストで '[TextFixtureSetup]が正しく動作するかどうかをテストします。私はちょうどこのセットアップ*は*罰金である必要があり、それ以上の検証を必要としないと思う。または私はこれに間違っていますか? –

関連する問題