3

私が自分自身に(そして今では全世界に、そしておそらくそれを超えて)提起する質問は、以下のコメントにあります。

[TestMethod()]
public void SetMessageTypeSubcodeTest()
{
    int AMessageTypeSubcode;
    // Should I put this class instantiation in MyTestInitialize?
    MessageClass target = new MessageClass(); 
. . .

私はこれを行う必要があります:

[TestInitialize()]
public void MyTestInitialize()
{
MessageClass target = new MessageClass(); 
}

...またはこれ:

[ClassInitialize()]
public void MyTestInitialize()
{
MessageClass target = new MessageClass(); 
}

...またはどちらでもない?

また、C#/.NET はガベージ コレクションであるため、TestCleanup() または ClassCleanup() メソッドで MessageClass を解放する必要はありませんね。

4

3 に答える 3

3

セット内のすべてのテストに対して、テストしているクラスの新しいインスタンスが必要です。これにより、起こりうる副作用 (発生する可能性があります) が防止され、その結果、相互に影響するテスト ( unitであり、分離されている必要があります) が回避されます。

于 2012-02-03T20:34:14.533 に答える
2

クラスの構築に費用がかからない限り、すべてのテストで行います。白紙の状態であることを保証します。その通りです。テストしている特定のことが必要でない限り、テスト終了時にクリーンアップを行う必要はありません (データベース接続のクローズ、Web プロトコルのハンドシェイクのクローズなど)。

于 2012-02-03T20:32:57.830 に答える
1

この質問に対する本当の「正しい」答えはありません。個人的には、あなたのコードを考えると、私はそのクラスのインスタンス化をいかなる種類のセットアップメソッドにも入れません。テストをより読みやすく完全なものにするために、各テスト内にそれを保持します。

ClassInitializeメソッドまたはTestInitializeメソッドを使用する適切なタイミングは、そのクラスのすべてのテストで使用する単一の一貫した環境を作成する場合であると思います。これが、「システムクラスごとに単一のテストクラス」アプローチが好きではない理由でもあります。各テストクラスは、テストに一貫した環境を提供するフィクスチャです。

すべての「新しいFoo()」をTestFixtureに移動するためのテストコードの過度に積極的なリファクタリングは、素晴らしくファクタリングされますが、単体テストを読むのが困難になります。そしてテストでは、そのレベルのファクタリングよりも読みやすさを重視しています。

于 2012-03-25T18:00:49.237 に答える