テスト対象のクラスのメソッドを呼び出す PUT を作成し、それに属性を付けるとPexMethod
、「Run Pex」はこのメソッドを使用して、自動生成されたテストを作成します。
これは、メソッドの呼び出しが PUT の本体に直接含まれている場合にのみ機能します。
サンプル:
この PUT は、「Run Pex」によって使用されます。
[PexGenericArguments(typeof(string))]
[PexGenericArguments(typeof(int))]
[PexGenericArguments(typeof(object))]
[PexMethod]
public string Convert01_ConverterForTypeNotRegistered<T>(
[PexAssumeUnderTest] ToStringConverter target, T objectToConvert)
{
var result = "";
result = target.Convert(objectToConvert);
return result;
}
この PUT は「Run Pex」では使用されません。
[PexGenericArguments(typeof(string))]
[PexGenericArguments(typeof(int))]
[PexGenericArguments(typeof(object))]
[PexMethod]
public string Convert01_ConverterForTypeNotRegistered_ThrowsInvalidOperationException<T>(
[PexAssumeUnderTest] ToStringConverter target, T objectToConvert)
{
var result = "";
PexAssert.Throws<InvalidOperationException>(() => target.Convert(objectToConvert));
return result;
}
メソッドを呼び出すと、パラメーターに関係なく、常にこの例外がスローされることを示したいと思います。
これを達成する方法は?
マイクロソフトの公式 Pex フォーラムで1 週間前にその質問をしましたが、回答が 1 つもなかったので、ここで 2 回投稿します。
問題は次のように再現できます。
- 1 つのメソッドを持つ 1 つのクラスを持つ 1 つのプロジェクトで単純なソリューションを用意します。
- そのメソッドを右クリックし、[Run Pex] を選択します。
- Pex 探索結果で、任意のエントリを右クリックし、[テストを保存...] を選択します。2 つの関連ファイルを含む新しいテスト プロジェクトが作成されます:
<class-name>Test.cs
と<class-name>Test.<MethodName>.g.cs
. 最初のファイルには PUT があり、2 番目のファイルには特定のテスト メソッドがあり、Pex が選択するパラメーターごとに 1 つです。最初のファイルに PUT があるメソッドに対して pex を実行するたびに、2 番目のファイルが自動的に再作成されます。 - テスト プロジェクトを右クリックし、[Pex] -> [生成された単体テストの削除] を選択します。これにより、2 番目のファイルから特定のテストが削除されます。
- PUT を含むファイルに移動し、PUT の名前を任意の名前に変更します。
- ポイント 1 からメソッドに戻り、再度右クリックして [Run Pex] を選択します。
- Pex は、「Test..g.cs.」という名前のテスト プロジェクトに新しいファイルを作成します。名前を変更しましたが、以前と同じ PUT を使用します。
- 名前はそのままにして、内容を PexAssert.Throws を使用した 2 番目の例に変更して、PUT を再度変更します。
- 再度、テスト プロジェクトを右クリックし、[Pex] -> [生成された単体テストの削除] を選択します。
- ここでも、ポイント 1 のメソッドを右クリックし、[Run Pex] を選択します。
- テスト プロジェクトの両方の *.g.cs ファイルを開くと、テストがないことがわかります。これは、Pex が PUT を使用しなかったことを意味します。それが問題です:)