2013-11-20 14 views
3

我有一个数据库操作对象作为我的UUT(Unit Under Test)的依赖关系。因此,我想将它作为一个严格的模拟,因为我还想确保UUT不会调用任何其他可能导致db更改的方法。Rhino Mocks'Expect'with FakeItEasy

在犀牛嘲笑我做了以下内容:

  1. 我做了一个strictmock从db对象
  2. 我做了.Expect子句中安排
  3. 我叫VerifyAllExpectations在断言

但是,当我想在FakeItEasy中执行此操作时,我无法找到无代码复制的方法。我试着把CallsTo()+ MustHaveHappened()部分放在Arrange中,但是然后我的测试失败了。如果我在Assert中放置了CallsTo()+ MustHaveHappened()部分,那么我的测试也会失败,因为意外调用了严格假。这可以在没有将CallsTo调用到Arrange和Assert的情况下完成吗?

+0

UUT = Unit Under Test? –

+0

是的,UUT =正在测试的单元 –

+0

我明白了,谢谢。我以前没有听说过这个词。我通常使用SUT - 被测系统。 –

回答

5

可以实现与以下验证:

var service = A.Fake<IService>(); 

testedObject.CallService("data"); 

// verify your specific call to .PostData 
A.CallTo(() => service.PostData("data")).MustHaveHappened(Repeated.Exactly.Once); 
// verify that no more than 1 call was made to fake object 
A.CallTo(service).MustHaveHappened(Repeated.Exactly.Once); 

A.CallTo(object)超载使您可以在所有的通用设置/验证和假冒对象方法的任何

+0

+1这工作。供参考我已经调查了FIE所有者,看看是否有更加优雅的方式来解决这个问题https://github.com/FakeItEasy/FakeItEasy/issues/198 –

+0

我回答@AdamRalph有一个“为什么不只是吮吸'()=> service.PostData ...)'变成一个变量并在排列和断言中使用它仍然是两个调用,就像在这个答案中一样,但是(我认为)稍微更加惯用的FIE。 –

6

虽然从@jimmy_keen答案就可以了(我甚至upvoted它)更习惯使用FakeItEasy的是:

// Arrange 
var service = A.Fake<IService>(o => o.Strict()); // only allows configured calls 
A.CallTo(() => service.PostData("data")).DoesNothing(); // allow a specific call 

// Act 
testedObject.CallService("data"); 

// Assert 
A.CallTo(() => service.PostData("data")).MustHaveHappened(Repeated.Exactly.Once); 

--- UPDATE ---

与@blairconrad帮助在https://github.com/FakeItEasy/FakeItEasy/issues/198#issuecomment-29145440我认为这是做到这一点的最简单的方法,没有重复:

// Arrange 
var service = A.Fake<IService>(o => o.Strict()); // only allows configured calls 
var expectedCall = A.CallTo(() => service.PostData("data")); 
expectedCall.DoesNothing(); // allow the call 

// Act 
testedObject.CallService("data"); 

// Assert 
expectedCall.MustHaveHappened(Repeated.Exactly.Once); 
+0

“这可以不用把CallsTo调用成Arrange和Assert?“ 我知道这个版本,我的问题正是关于避免这种情况。 –

+0

你有一点关于代码重复的问题。目前没有办法通过严格的伪造代码来实现这一点,而没有代码重复。我已经在FakeItEasy上重新开放了这个问题,以进一步讨论https://github.com/FakeItEasy/FakeItEasy/issues/198#issuecomment-29138957 –

+0

哇,所以CallTo返回一个“通话对象”,以后可以验证。有趣的,upvoted。 –