1

テスト対象のクラスのメソッドを呼び出す 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 つのクラスを持つ 1 つのプロジェクトで単純なソリューションを用意します。
  2. そのメソッドを右クリックし、[Run Pex] を選択します。
  3. Pex 探索結果で、任意のエントリを右クリックし、[テストを保存...] を選択します。2 つの関連ファイルを含む新しいテスト プロジェクトが作成されます:<class-name>Test.cs<class-name>Test.<MethodName>.g.cs. 最初のファイルには PUT があり、2 番目のファイルには特定のテスト メソッドがあり、Pex が選択するパラメーターごとに 1 つです。最初のファイルに PUT があるメソッドに対して pex を実行するたびに、2 番目のファイルが自動的に再作成されます。
  4. テスト プロジェクトを右クリックし、[Pex] -> [生成された単体テストの削除] を選択します。これにより、2 番目のファイルから特定のテストが削除されます。
  5. PUT を含むファイルに移動し、PUT の名前を任意の名前に変更します。
  6. ポイント 1 からメソッドに戻り、再度右クリックして [Run Pex] を選択します。
  7. Pex は、「Test..g.cs.」という名前のテスト プロジェクトに新しいファイルを作成します。名前を変更しましたが、以前と同じ PUT を使用します。
  8. 名前はそのままにして、内容を PexAssert.Throws を使用した 2 番目の例に変更して、PUT を再度変更します。
  9. 再度、テスト プロジェクトを右クリックし、[Pex] -> [生成された単体テストの削除] を選択します。
  10. ここでも、ポイント 1 のメソッドを右クリックし、[Run Pex] を選択します。
  11. テスト プロジェクトの両方の *.g.cs ファイルを開くと、テストがないことがわかります。これは、Pex が PUT を使用しなかったことを意味します。それが問題です:)
4

1 に答える 1

0

Visual Studio 2010 で両方の例を実行してみました。2 番目の例を というクラスを使用するように変更しましたThrowingConverter

public class ToStringConverter {
    internal string Convert(object objectToConvert) {
        return objectToConvert.ToString();
    }
}

public class ThrowingConverter {
    internal string Convert(object objectToConvert) {
        if (objectToConvert is string) {
            return (string)objectToConvert;
        }
        throw new InvalidOperationException();
    }
}

Pex を実行したところ、次のテスト ケースが作成されました。

  • ToStringConverter:
    • int
      • 0
      • 1
    • string
      • null(で失敗NullReferenceException)
      • ""
    • object
      • null(で失敗NullReferenceException)
      • new object()
  • ThrowingConverter:
    • int
      • 0
    • string
      • null
      • ""( を返すので失敗"")
    • object
      • null
      • ""( を返すので失敗"")

これはまさに私が期待していたものなので、あなたの問題は実際にはわかりません。

于 2011-03-22T20:57:22.383 に答える