是否可以模拟存根/模拟对象成员调用而不必将其定义为存根,并将返回值设置为所有单独的详细行?
示例:
[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);
}
所有这些临时变量是否只是为了存根嵌套方法调用?
答案 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的方法来创建多个存根。