我正在努力了解新的AAA语法如何在Rhino Mocks中运行。我的大部分测试都是这样的:
[Test]
public void Test()
{
//Setup
ISth sth= mocks.DynamicMock<ISth>();
//Expectations
Expect.Call(sth.A()).Return("sth");
mocks.ReplayAll();
//Execution
FunctionBeingTested(sth);
//...asserts, etc
//Verification
mocks.VerifyAll();
}
使用AAA语法会是什么样子?
答案 0 :(得分:3)
最有可能是这样的:
[Test]
public void Test()
{
// Arrange
ISth sth= MockRepository.GenerateMock<ISth>();
sth
.Stub(x => x.A())
.Return("sth");
// Act
FunctionBeingTested(sth);
// Assert
}
要真正受益于新的AAA语法,您必须改变主意。我试着解释一下。
我的建议存在重大差异:没有“Expect-Verify”。所以我建议不要期待这个电话,因为有一个回报值。我假设该方法在未调用sth.A
时无法通过测试,因为它将错过正确的返回值。它至少会失败一个其他断言。
这实际上是一件好事。
还有另一种情况,您确实需要检查是否已在模拟上调用方法。主要是如果它返回void。例如:应该触发事件,提交事务等等。请使用AssertWasCalled
:
[Test]
public void Test()
{
// Arrange
ISth sth= MockRepository.GenerateMock<ISth>();
// Act
FunctionBeingTested(sth);
// Assert
sth
.AssertWasCalled(x => x.A());
}
注意:没有返回值,所以没有Stub。这是一个理想的案例。当然,您可以同时拥有Stub
和AssertWasCalled
。
还有Expect
和VerifyAllExpectations
,其实际行为与旧语法相似。我只会在你需要 Stub
和AssertWasCalled
的同一个测试中使用它们,和你有你不想要的互补参数约束写两次。通常,避免 Expect
和VerifyAllExpectations
答案 1 :(得分:1)
[Test]
public void WhenUserForgetPasswordWillSendNotification_UsingExpect()
{
var userRepository = MockRepository.GenerateStub<IUserRepository>();
var notificationSender = MockRepository.GenerateMock<INotificationSender>();
userRepository.Stub(x => x.GetUserById(5)).Return(new User { Id = 5, Name = "ayende" });
notificationSender.Expect(x => x.Send(null)).Constraints(Text.StartsWith("Changed"));
new LoginController(userRepository, notificationSender).ForgotMyPassword(5);
notificationSender.VerifyAllExpectations();
}
你的测试中的变化
[Test]
public void Test()
{
//Arrange
var sth= MockRepository.GenerateMock<ISth>();
sth.Expect(x=>sth.A()).Return("sth");
//Act
FunctionBeingTested(sth);
//Assert
sth.VerifyAllExpectations();
}
但这只是一个长镜头。写了,因为我怀疑它。