この質問は、MSTest を使用した Visual Studio での単体テストに関するものです (MSTest の実行順序のため、これは重要です)。[TestInitialize] とマークされたメソッドとテスト クラス コンストラクターの両方が、各テスト メソッドの前に実行されます。
では、質問は、これらの各領域で何をする傾向があるかということです。どちらかで特定の活動を行うことを避けますか? あなたの理由は何ですか: スタイル、技術、迷信?
この質問は、MSTest を使用した Visual Studio での単体テストに関するものです (MSTest の実行順序のため、これは重要です)。[TestInitialize] とマークされたメソッドとテスト クラス コンストラクターの両方が、各テスト メソッドの前に実行されます。
では、質問は、これらの各領域で何をする傾向があるかということです。どちらかで特定の活動を行うことを避けますか? あなたの理由は何ですか: スタイル、技術、迷信?
コンストラクターは、言語によって提供される単なる構造です。すべてのテスト フレームワークには、独自の制御されたライフサイクル「初期化」があるようです。おそらく、コンストラクターを使用してローカルを変更するだけで問題が発生するでしょう。
MSTest:すべてのテスト クラスのまったく新しいインスタンスを取得しますTestMethod
。これは、コンストラクター、イニシャライザー、またはテスト メソッドでローカルを変更しても問題なく、他のテスト メソッドに影響を与えない唯一のケースかもしれません。
public class TestsForWhatever
{
public TestsForWhatever()
{
// You get one of these per test method, yay!
}
[TestInitialize]
public void Initialize()
{
// and one of these too!
}
[TestMethod]
public void AssertItDoesSomething() { }
[TestMethod]
public void AssertItDoesSomethingElse() { }
}
MSpec:すべてのアサーションに対して1 つだけ取得Establish
します ( )。したがって、アサーションでローカルを変更しないでください。また、基本コンテキストでのローカルのミューテーションに依存しないでください (使用する場合)。Because
It
[Subject(typeof(Whatever))]
public class When_doing_whatever
{
Establish context = () =>
{
// one of these for all your Its
};
Because of = () => _subject.DoWhatever();
It should_do_something;
It should_do_something_else;
}
TestInitialize で私が見つけたいくつかの利点を次に示します。
テストクラスインスタンスまたは静的コンストラクターではなく、TestInitialize()またはClassInitialize()を使用する主な利点は、その明示的な性質です。テストの前にセットアップを行っていることを明確に伝えます。これを一貫して行うことで、長期的には保守性が向上するはずです。
この質問は、(後で) VS テスト フレームワークと TestInitialize() 属性でコンストラクターを使用することの違いは何ですか?でも尋ねられます。
FWIW「クラスコンストラクター」とは、インスタンスコンストラクター(静的コンストラクターではなく)を意味すると思います。
あなたが求めているのと同じ質問が、静的コンストラクターとClassInitializeについて同様に尋ねられる可能性があると思います...
テストするオブジェクトは、[TestInitialize] メソッドでインスタンス化する必要はありません。オブジェクトのコンストラクターは、テスト メソッド [Test] でテストできます。
[TestInitialize] 内のオブジェクトは、永続ストレージをセットアップしたり、テスト対象のオブジェクトがテストで使用する値を準備したりすることができます。