提问者:小点点

Rhino用FakeItEasy模拟“expect”


我有一个数据库操作对象作为我的UUT(被测试单元)的依赖项。因此,我希望将其作为严格的mock,因为我还希望确保UUT不调用任何其他可以导致db更改的方法。

在rhino mocks中,我做了以下操作:

  1. 我从db对象创建了一个strictmock
  2. 我在安排中创建了.expect子句
  3. 我在assert中调用了VerifyAllExpectations

然而,当我想在FakeItEasy中这样做时,却找不到没有代码重复的情况下如何做。我尝试将CallsTo()+musthaveHappence()部分放入安排中,但随后我的测试失败了。如果我将CallsTo()+musthaveHappend()部分放在Assert中,那么我的测试也会失败,因为对严格的fake进行了意外调用。这可以在不将CallsTo调用同时放入安排和断言的情况下完成吗?


共2个答案

匿名用户

您可以通过以下验证来实现此目的:

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);