Unit testing Rhino能否直接模拟更深层/嵌套的成员?

Unit testing Rhino能否直接模拟更深层/嵌套的成员?,unit-testing,rhino-mocks,Unit Testing,Rhino Mocks,是否可以模拟stub/mock的对象成员调用,而不必将其定义为stub,并将返回值设置为所有单独的详细行 例如: [TestMethod] public void AssignedPermissions_AssociateExists_ReturnsEdit_Rhino() { //Arrange var fakeConfiguration = MockRepository.GenerateStub<IDomainController

是否可以模拟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);
    }
[TestMethod]
public void assigned permissions\u AssociateExists\u ReturnsEdit\u Rhino()
{
//安排
var fakeConfiguration=MockRepository.GenerateStub();
var fakeassociatepository=MockRepository.GenerateStub();
存根(x=>x.associatepository).Return(fakeassociatepository);
存根(x=>x.GetAssociatesByRole(null,false,null)).IgnoreArguments()
.Return(新的IASociate[]{MockRepository.generateSub()});
var域=新域控制器(fakeConfiguration);
const AssignedPermission预期=AssignedPermission.Edit;
//表演
AssignedPermission actual=域。AssignedPermissions();
//断言
断言.AreEqual(预期、实际);
}

所有这些临时变量都是删除嵌套方法调用所必需的吗?

我从未使用过该功能,因此我不能100%确定这是否有效,但从理论上讲Rhino mocks支持“”,这至少可以让您通过执行以下操作来消除伪关联假设:

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);
var fakeConfiguration=MockRepository.generateSub();
存根(x=>x.AssociatePository.GetAssociatesByRole(null,false,null))
.IgnoreArguments()
.Return(新的IASociate[]{MockRepository.generateSub()});
var域=新域控制器(fakeConfiguration);

(注意:代码没有经过测试,甚至没有经过编译)

我只是想分享一下我在这方面的意见,因为我刚刚花了最后几个小时来研究它。上面由Alconja发布的答案绝对有效,但如果您计划将其用于“AssertWasCall”类型的断言,则它不会以我期望的方式进行断言。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正在断言AssociatePository属性的get访问器,而不是GetAssociatesByRole()方法。最后,在我的案例中,我不得不使用OP的方法来创建多个存根。

您遇到了违反德米特定律的后果之一:@wcoenen well。。配置对象实际上不应该直接处理调用方在其内部所做的事情?因此,至少这一层次的筑巢似乎很重要或有价值。由于这只是一个简单的数据,所以不必在配置对象上添加传递方法。为什么不为存储库添加一个构造函数参数呢<代码>新域控制器(伪造配置、伪造存储)