使用新的Rhino Mocks 3.5 Arrange / Act / Assert(AAA)测试风格,我在编写测试时遇到了问题。
我有一个在存储库类上调用方法的方法。 ActivateFoo,我的Foo对象具有IsActive属性。 ActivateFoo对象的结果应更改属性。
这是示例代码:
[TestMethod]
public void Should_update_foo_to_active_inside_of_repository()
{
// arrange
var repo = MockRepository.GenerateMock<IRepository>();
var foo = new Foo() { ID = 1, IsActive = false };
var target = new Presenter(repo);
repo.Expect(x => x.ActivateFoo(foo)).Return(true);
// act
target.Activate(foo);
// assert
Assert.IsTrue(foo.IsActive);
repo.VerifyAllExpectations();
}
我猜关键的代码段将在“ ActivateFoo(foo))之间。”和“ Return(true);”。
需要澄清的一点是,方法链接的东西是如何在后台工作的。如果在我期望的行上编写了代码,那么在Return()之后还是之前是否有关系? (当然,除非解决方案正在使用Expect的MethodOptions重载,或其他方法)。
在此先感谢您的帮助。
最佳答案
您可能想使用Do处理程序尝试这种操作。老实说,我认为ActivateFoo应该为void返回类型。但是这是带有布尔返回类型的ActivateFoo的代码。
[TestMethod]
public void Should_update_foo_to_active_inside_of_repository()
{
// arrange
var repo = MockRepository.GenerateMock<IRepository>();
var foo = new Foo() { ID = 1, IsActive = false };
var target = new Presenter(repo);
repo.Expect(x => x.ActivateFoo(foo)).
Do(new ActivateFooDelegate(ActivateFooDelegateInstance));
// act
target.Activate(foo);
// assert
Assert.IsTrue(foo.IsActive);
repo.VerifyAllExpectations();
}
private delegate bool ActivateFooDelegate(Foo f);
public bool ActivateFooDelegateInstance(Foo f)
{
f.IsActive = true;
return f.IsActive;
}