如何设置Stub对象的方法在第一次调用时返回5,然后在第二次调用时返回7?

时间:2011-12-21 09:16:38

标签: c# .net unit-testing rhino-mocks stub

如果你有一个界面:

public interface ILuckynumberService
{
   int GetMyLuckyNumber();
}

如果你为这个界面生成一个存根,如下所示,你怎么能强制它在第一次调用时返回5,然后在第二次调用时返回7,在第三次调用时返回11?

stubLuckyService = MockRepository.GenerateStub<ILuckyService>();
// Now, how to arrange stubLuckyService here?

3 个答案:

答案 0 :(得分:1)

可能是这样的:

 int[] numbers = new[] {5, 7, 11};
 var cnt = 0;
 Func<int> numberToReturnFunc = () => { 
     var numberToReturn = numbers[cnt];
     cnt = cnt+1;
     return numberToReturn;
 }
 stubLuckyService.Stub(y => y.GetMyLuckyNumber()).Return(numberToReturnFunc());

我自己没有尝试过,但它可以工作。它至少编译:)。

答案 1 :(得分:1)

以下是我将如何做到这一点,尽管可能有更直接的方式:

var results = new[] {5, 7, 11};
var count = 0;
service.Expect(x => x.GetMyLuckyNumber()).Return(0)
                                         .WhenCalled(x => { 
                                                x.ReturnValue = results[count];
                                                count++;
                                         });

答案 2 :(得分:0)

另一种选择是使用Repeat.Once():

service.Expect(x => x.GetMyLuckyNumber()).Return(5).Repeat.Once();
service.Expect(x => x.GetMyLuckyNumber()).Return(7).Repeat.Once();
service.Expect(x => x.GetMyLuckyNumber()).Return(11).Repeat.Once();