1

次のコードがあります。そのプロパティを 2 回スタブ化する正当な理由があります (以下の説明を参照)。スタブを一度だけ許可しているようです。

private IStatus _status;

[SetUp()]
public void Setup() {
  this._status = MockRepository.GenerateStub<IStatus>();
  this._status.Stub(x => x.Connected()).Return(true);
  // This next line would usually be in the Setup for a subclass
  this._status.Stub(x => x.Connected()).Return(false);
}

[Test()]
public void TestTheTestFramework() {
  Assert.IsFalse(this._status.Connected()); // Fails...
}

public interface IStatus {
  bool Connected { get; }
}

最新のビルド(3.6 ビルド 21) をダウンロードしようとしましたが、それでも同じ問題が発生します。なぜこれができないのかについてのアイデアはありますか?ConnectedプロパティをIStatus関数に変更しようとしましたが、テストはまだ失敗しました。VB.Net でも同じ動作をします... バグですか?

ダブルスタブの説明

継承を中心にテストを構成しています。そうすれば、注入されたモック依存関係を使用してさまざまな条件をシミュレートし、共通のセットアップ コードを 1 回だけ実行できます。接続がダウンしたときの SUT の動作をテストするサブクラスでオーバーライドしたい基本/デフォルトのスタブ値 (たとえば、はい、接続されています) を提供する場合があります。私は通常、このようなコードになります。

[TestFixture()]
public class WhenPublishingAMessage {

  // Common setup, inject SUT with mocked dependencies, etc...

  [Test()]
  public void ShouldAlwaysWriteLogMessage {
    //Example of test that would pass for any sub-condition
  }

  [TestFixture()]
  public class AndNoConnection : WhenPublishingAMessage {
    // Do any additional setup, stub dependencies to simulate no connection
    // Run tests for this condition
  }

  [TestFixture()]
  public class AndHaveConnection : WhenPublishingAMessage {
    // Do any additional setup and run tests for this condition
  }
}

編集

Rhino Mocks google グループのこの投稿が参考になるかもしれません。this._status.BackToRecord();状態をリセットするには、いわば呼び出す必要があるようです...また、 .Repeat.Any()2番目のスタブステートメントに追加することも役立つようです。後で詳細を投稿する必要があります。

4

2 に答える 2

0

すべてを要約すると、可能な3つの異なる答えがあります。

トールマリスの答え:

.Repeat.Times(n)、、などを使用して.Repeat.Once()、最初のスタブに戻る特定の回数を指定します.Repeat.Twice()。次に例を示します。

this._status.Stub(x => x.Connected()).Return(true).Repeat.Once(); this._status.Stub(x => x.Connected()).Return(false);

このメソッドは、動作を変更する前にスタブが呼び出される回数がわかっている場合に非常にうまく機能します(たとえば、コンストラクターで1回だけ呼び出される)。

モックオブジェクトをリセットする

(少なくとも私にとっては)もっと面倒なExpect / Verification Record / Replayタイプの構文を避けたいので、このメソッドは好きではありません。この質問と同じタイトルのRhinoMocksGoogleグループへの投稿に応えて、私に勧めていました。

this._status.Stub(x => x.Connected).Return(true);

this._status.GetMockRepository().BackToRecordAll();
this._status.GetMockRepository().ReplayAll();

this._status.Stub(x => x.Connected).Return(false);

魔法のリピートを使用します。

2番目のスタブで使用.Repeat.Any()すると最初のスタブが無効になることがわかりました...それを機能させるためにいくつかの「魔法の」コードを追加するのは少し気分が悪いですが、最初のスタブを伝える頻度がわからない場合戻るには、このオプションが機能します。

this._status.Stub(x => x.Connected()).Return(true);
this._status.Stub(x => x.Connected()).Return(false).Repeat.Any();

.Repeat.Any()注:複数回実行することはできません。

于 2012-11-01T16:57:37.863 に答える