2013-03-06 104 views
8

对于我的测试,我需要第一次调用存根以返回一个对象,并在下一次调用时返回不同的对象。我在record()块中的其他模拟对象框架中看到过这一点,但我还没有想到如何在FakeItEasy中做到这一点。 FakeItEasy是我们商店的强制性框架,我使用AutoFixture生成假货。从FakeItEasy返回不同的对象A.CallTo()

我看着NextCall,但它看起来不像我可以指定一个返回值。

这里是想我做的一个想法:

ReceiveMessageResponse queueResponse1 = fixture.Create<ReceiveMessageResponse>(); 
ReceiveMessageResponse queueResponse2 = fixture.Create<ReceiveMessageResponse>(seed); 
A.CallTo(() => sqsClient.ReceiveMessage(null)).WithAnyArguments().Returns(queueResponse1); 
//The following should happen the second time... 
A.CallTo(() => sqsClient.ReceiveMessage(null)).WithAnyArguments().Returns(queueResponse2); 

任何帮助表示赞赏。

回答

14

两种方式做到这一点,其中之一就是你指的是你自己的答案之一:

A.CallTo(() => foo.Bar()).ReturnsNextFromSequence(new[] { response1, response2 }); 

另一种方法是:

A.CallTo(() => foo.Bar()).Returns(response2); 
A.CallTo(() => foo.Bar()).Returns(response1).Once(); 
+0

秩序的第二种方法是获取重要这行得通 – Fabio 2016-09-22 08:30:48

7

当然,它每次都会发生。在几分钟内发布我自己遇到的答案。

我最终使用:

ReturnsNextFromSequence(new [] {queueResponse1, queueResponse2}); 

我不知道这是首选的方法,但它为我的伟大工程。