Unit testing Rhino能否直接模拟更深层/嵌套的成员?
是否可以模拟stub/mock的对象成员调用,而不必将其定义为stub,并将返回值设置为所有单独的详细行 例如: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
[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。。配置对象实际上不应该直接处理调用方在其内部所做的事情?因此,至少这一层次的筑巢似乎很重要或有价值。由于这只是一个简单的数据,所以不必在配置对象上添加传递方法。为什么不为存储库添加一个构造函数参数呢<代码>新域控制器(伪造配置、伪造存储)代码>