RhinoMocks在未调用方法时返回值

时间:2012-12-31 07:49:01

标签: c# rhino-mocks

我想做以下事情......

在调用方法之前,某个属性必须始终返回值x 调用方法后,某个属性必须始终返回值y

我熟悉RhinoMocks中的WhenCalled方法,它允许我在调用方法后设置返回值,但我想不出在调用之前设置返回值的方法。到目前为止,我有以下代码......

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

这可能吗?

3 个答案:

答案 0 :(得分: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));
    
  3. 这两种情况都是一样的:最初GetCounter返回1。每个IncreaseConter()调用都会增加GetCounter返回的值。

    PS
    如果您不打算对counter进行断言,则可能适合使用Stub()而不是Expect()进行设置。参见例如this question了解详情。

答案 1 :(得分:1)

在mocked方法的回调中设置属性的新返回值:

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));

Mocked属性将返回1,直到调用mocked方法。然后它的返回值将设置为42。所有对mocked属性的进一步调用都将返回42

答案 2 :(得分: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;
    });