使用新的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;
    }

10-08 14:39