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

有两种解决方案可以解决问题:

  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返回1. 每次IncreaseConter()调用都会增加返回的值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 回答