Rhino可以直接模拟更深层/嵌套的成员吗?

时间:2010-02-02 21:35:24

标签: unit-testing rhino-mocks

是否可以模拟存根/模拟对象成员调用而不必将其定义为存根,并将返回值设置为所有单独的详细行?

示例:

    [TestMethod]
    public void AssignedPermissions_AssociateExists_ReturnsEdit_Rhino()
    {

       //Arrange
        var fakeConfiguration = MockRepository.GenerateStub<IDomainControllerConfiguration>();
         var fakeAssociateRepository = MockRepository.GenerateStub<IAssociateRepository>();
        fakeConfiguration.Stub(x => x.AssociateRepository).Return(fakeAssociateRepository);
        fakeAssociateRepository.Stub(x=>x.GetAssociatesByRole(null,false,null)).IgnoreArguments()
            .Return(new IAssociate[]{MockRepository.GenerateStub<IAssociate>()});

        var domain = new DomainController(fakeConfiguration);

        const AssignedPermission expected = AssignedPermission.Edit;

        //Act
        AssignedPermission actual = domain.AssignedPermissions();

        //Assert
        Assert.AreEqual(expected, actual);
    }

所有这些临时变量是否只是为了存根嵌套方法调用?

2 个答案:

答案 0 :(得分:3)

我从来没有使用过这个功能,所以我不是100%肯定这会起作用,但理论上Rhino模拟支持“recursive mocking”,它应该允许你至少通过做什么来删除fakeAssociateRepository像这样的东西:

var fakeConfiguration = MockRepository.GenerateStub<IDomainControllerConfiguration>();
fakeConfiguration.Stub(x => x.AssociateRepository.GetAssociatesByRole(null,false,null))
            .IgnoreArguments()
            .Return(new IAssociate[]{MockRepository.GenerateStub<IAssociate>()});

var domain = new DomainController(fakeConfiguration);

(注意:代码未测试,甚至未编译)

答案 1 :(得分:0)

只想分享我的意见,因为我刚刚花了最后几个小时来努力。 Alconja上面发布的答案绝对有效,但是如果您打算将其用于“ AssertWasCalled”类型的声明,则不会声明我期望的方式。看来,AssertWasCalled方法试图声明与“嵌套”对象关联的“获取访问器”。

例如,如果您想这样做:

fakeconfiguration.AssertWasCalled(x => x.AssociateRepository.GetAssociatesByRole(null, false, null));

您将获得诸如

之类的异常。
System.InvalidOperationException : Previous method 'IDomainControllerConfiguration.get_AssociateRepository();' requires a return value or an exception to throw.

因为AssertWasCalled声明了AssociateRepository属性的get-accessor,而不是GetAssociatesByRole()方法。最后,对于我来说,我不得不使用OP的方法来创建多个存根。