我有一个数据库操作对象作为我的UUT(被测试单元)的依赖项。因此,我希望将其作为严格的mock,因为我还希望确保UUT不调用任何其他可以导致db更改的方法。
在rhino mocks中,我做了以下操作:
然而,当我想在FakeItEasy中这样做时,却找不到没有代码重复的情况下如何做。我尝试将CallsTo()+musthaveHappence()部分放入安排中,但随后我的测试失败了。如果我将CallsTo()+musthaveHappend()部分放在Assert中,那么我的测试也会失败,因为对严格的fake进行了意外调用。这可以在不将CallsTo调用同时放入安排和断言的情况下完成吗?
您可以通过以下验证来实现此目的:
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)
重载允许您对所有和任何假对象方法进行通用设置/验证。
虽然@jimmy_keen的回答会奏效(我甚至支持它),但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);
---更新---
在https://github.com/fakeiteasy/fakeiteasy/issues/198#issuecomment-29145440的@blairconrad的帮助下,我认为这是最简单的方法,没有重复:
// 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);