2

次のことをしたい...

メソッドが呼び出されるまで、特定のプロパティは常に値 x を返さなければなりません メソッドが呼び出された後、特定のプロパティは常に値 y を返さなければなりません

メソッドが呼び出された後に戻り値を設定できる RhinoMocks の WhenCalled メソッドについてはよく知っていますが、呼び出しの前に戻り値を設定する方法が思い浮かびません。これまでのところ、次のコードがあります...

counter.Expect(n => n.IncreaseCounter())
   .WhenCalled(i => counter.Expect(n => n.GetCounter)
   .Return(Y).Repeat.Any());

これは可能ですか?

4

3 に答える 3

4

このトリックを実行するには、2 つの解決策があります。

  1. 使用法WhenCalled():

    var counter = MockRepository.GenerateStub<ICounter>();
    
    int cnt = 1;
    
    counter
        .Stub(c => c.GetCounter)
        .Return(0)
        .WhenCalled(invocation => { invocation.ReturnValue = cnt; });
    
    counter
        .Stub(c => c.IncreaseCounter())
        .WhenCalled(invocation => { ++cnt; });
    
  2. 使用Do()ハンドラあり

    var counter = MockRepository.GenerateStub<ICounter>();
    
    int cnt = 1;
    
    counter
        .Stub(c => c.GetCounter)
        .Do((Func<int>)(() => cnt));
    
    counter
        .Stub(c => c.IncreaseCounter())
        .Do((Action)(() => ++cnt));
    

どちらの場合も考え方は同じです: 最初は をGetCounter返します1IncreaseConter()呼び出しごとに値が増加し、 によって返されGetCounterます。

PS
に対してアサーションを行うつもりがない場合は、ではなく でcounterセットアップするのがおそらく適切です。詳細については、たとえばこの質問を参照してください。Stub()Expect()

于 2012-12-31T13:49:32.487 に答える
1

モックされたメソッドのコールバックでプロパティの新しい戻り値を設定するだけです。

Mock<IFoo> fooMock = new Mock<IFoo>();
fooMock.Setup(foo => foo.Property).Returns(1);
fooMock.Setup(foo => foo.Method())
       .Callback(() => fooMock.Setup(x => x.Property).Returns(42));

モックされたプロパティは1、モックされたメソッドが呼び出されるまで戻ります。次に、その戻り値はに設定され42ます。モックされたプロパティへのそれ以降のすべての呼び出しは、を返し42ます。

于 2012-12-31T14:20:10.347 に答える
0

アレクサンダーの解決策に基づいて...以下が私が探していたものでした...

var counter = MockRepository.GenerateStub<ICounter>();

int x = 1;
int y = 2;
int cnt = x;

counter
    .Stub(c => c.GetCounter)
    .Return(0)
    .WhenCalled(invocation =>
    {
        invocation.ReturnValue = cnt;
        cnt = y;
    });
于 2013-01-14T14:29:42.240 に答える