Stub不会使用repeat返回不同的返回值

时间:2016-09-20 09:32:21

标签: c# .net rhino-mocks

设置非常简单:

var myMock = MockRepository.GenerateMock<IInterface>();
myMock.Stub(r => r.GetAll(null))
      .IgnoreArguments();  


myMock.Return(new List<DTO> { dto2 }).Repeat.Once();
myMock.Return(new List<DTO> { dto1, dto2 });

dto1和2是2个预定义对象。

第一次调用方法GetAll时,返回包含2个项目的列表!应首先返回第一个定义,然后所有其他调用将返回包含2个项目的列表。

发生了什么事?

**我搜索了原因,但一无所获。

2 个答案:

答案 0 :(得分:1)

在RhinoMocks中,您可能需要记录一系列有序的期望:

var mock = MockRepository.GenerateMock<IInterface>();
using (mock.GetRepository().Ordered())
{
   mockFoo.Expect(x => x.GetAll(null)).IgnoreArguments().Return(result1);
   mockFoo.Expect(x => x.GetAll(null)).IgnoreArguments().Return(result2);
}
mock.Replay();

// rest of the test goes here...

mock.VerifyAllExpectations();

在Moq中SetupSequence会更优雅:

myMock.SetupSequence(x => x.GetAll(It.IsAny<TheArgType>()))
        .Returns(new List<DTO> { dto2 })
        .Returns(new List<DTO> { dto1, dto2 });

答案 1 :(得分:0)

我决定采用一种讨厌的解决方法:

 var callNumber = 1;
 myMock.Stub(r => r.GetAll(null))
       .WhenCalled(m =>
       {
          m.ReturnValue = callNumber != 1 ? new List<DTO> { dto1, dto2 } : new List<DTO> { dto2 };

          callNumber++;
       });