代码之家  ›  专栏  ›  技术社区  ›  Maslow

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

  •  6
  • Maslow  · 技术社区  · 15 年前

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

    例子:

        [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 回复  |  直到 6 年前
        1
  •  3
  •   Alconja    15 年前

    我从来没有使用过这个功能,所以我不能百分之百确定它是否能工作,但理论上rhino mocks支持 recursive mocking “,这至少可以让您通过这样做来消除虚假的关联关系:

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

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

        2
  •  0
  •   Joshua    6 年前

    我只是想分享我的意见,因为我只是花了最后几个小时与之搏斗。上面由alconja发布的答案是绝对有效的,但是如果您打算将它用于“assertwascalled”类型的断言,那么它不会像我期望的那样断言。AssertWasCalled方法似乎试图断言与“嵌套”对象关联的“get访问器”。

    例如,如果要执行此操作:

    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正在断言associaterpository属性的get访问器,而不是getassociatesbyrole()方法。最后,对于我的例子,我不得不使用op的方法来创建多个存根。