4

2 つのブール値パラメーターを受け取る関数をスタブしたいと考えています。1 つ目は必須で、2 つ目はオプションです。最初に Arg.Is.Anything を送信しようとして、2 番目の情報がない場合、次のエラーが表示されます。

System.InvalidOperationException : Arg を使用する場合、すべての引数は Arg.Is、Arg.Text、Arg.List、Arg.Ref、または Arg.Out を使用して定義する必要があります。2 つの引数が必要ですが、1 つが定義されています。

スタブするクラスのサンプルを次に示します。

   public interface IOptionalParameterTester
   {
      bool IsValid(bool mustCheck, bool checkInDatabase = true);
   }

   public class OptionalParameterTester : IOptionalParameterTester
   {
      public bool IsValid(bool mustCheck, bool checkInDatabase = true)
      {
         if (checkInDatabase)
            return true;
         else
            return false;
      } 
   }

そして、ここにテストのサンプルがあります:

  [Test]
  public void ValidateProducerTest()
  {
     IOptionalParameterTester optionalParameter = MockRepository.GenerateStub<IOptionalParameterTester>();

     optionalParameter.Stub(x => x.IsValid(Arg<bool>.Is.Anything)).Return(true);
  }

この場合、エラーなしでテストに合格するには、最初の (Arg.Is.Anything) と同じ情報、または true や false などの特定のブール値を定義する必要があります。

最初のパラメーターに Arg.Is.Anything 以外を設定すると、エラーは発生しません。

バグですか?

オプションのパラメータごとに値を定義する必要がないように、RhinoMock でオプションを設定できますか?

セットアップがない場合、このケースを処理するためのより良い方法はありますか (ベスト プラクティス、パターンなど)?

ありがとうございました。

4

3 に答える 3

1

私はあなたが何をしようとしているのか理解していると思いますが、これはRhino Mocksの制限であるように思われるので(あなたが受け取ったエラーメッセージからその結論を得ることができます)、テスト戦略を変更することをお勧めします.

次のことを試してください。

[Test]
  public void ValidateProducerTest()
  {
     bool anyBooleanValue = true;
     IOptionalParameterTester optionalParameter = MockRepository.GenerateStub<IOptionalParameterTester>();

     optionalParameter.Stub(x => x.IsValid(anyBooleanValue)).Return(true);
  }

あなたのテストでは、Rhino Mocks に最初のパラメーターを無視させ、オプションの 2 番目のパラメーターを使用させることはわかっていますが、テストするロジックによっては、最初のパラメーターをハードコーディングするだけで、Rhino Mocks は文句を言うべきではありません。

テストで、最初のパラメーターの値が関連していないことが明確に述べられている限り、テストは有効で読み取り可能です。

于 2012-03-27T21:24:33.070 に答える