[英]In Rhino Mocks, how to stub a method using a null argument?
我有一个方法canUserRead,它可以作为用户处理null参数(因为有时用户未登录)。
现在,我想创建一个存根,其行为反映该方法的行为。 我试过了:
IAccessRightsManager stubAccessRights = new
MockRepository.GenerateStub<IAccessRightsManager>();
// if there is no user logged in
stubAccessRights.Stub(ar => ar.canUserRead(null, confidentialDocument))
.Return(false); //doesn't compile
stubAccessRights.Stub(ar => ar.canUserRead(null, nonConfidentialDocument))
.Return(true); //doesn't compile
// if there is a user without confidentiality clearance logged in
stubAccessRights.Stub(ar => ar.canUserRead(nonPrivilegedUser, confidentialDocument))
.Return(false);
stubAccessRights.Stub(ar => ar.canUserRead(nonPrivilegedUser, nonConfidentialDocument))
.Return(true);
// if there is a user with confidentiality clearance logged in
stubAccessRights.Stub(ar => ar.canUserRead(privilegedUser, confidentialDocument))
.Return(true);
stubAccessRights.Stub(ar => ar.canUserRead(privilegedUser, nonConfidentialDocument))
.Return(true);
这不会编译,因为null不是IUser类型。 而且null没有引用身份,因此使用null初始化新的IUser变量无济于事。
那么,我该如何创建一个存根方法,该方法在传递null参数时返回明智的选择?
我建议Arg<T>.Is.Null
:
stubAccessRights
.Stub(ar => ar.canUserRead(Arg<IUser>.Is.Null, confidentialDocument))
.Return(false);
stubAccessRights
.Stub(ar => ar.canUserRead(Arg<IUser>.Is.Null, nonConfidentialDocument))
.Return(true);
尝试这个:
IAccessRightsManager stubAccessRights = new
MockRepository.GenerateStub<IAccessRightsManager>();
stubAccessRights.Stub(ar => ar.canUserRead((IUser)null, confidentialDocument))
.Return(false);
stubAccessRights.Stub(ar => ar.canUserRead((IUser)null, nonConfidentialDocument))
.Return(true);
我认为您可以使用Arg<T>.Is.Anything
语法
IAccessRightsManager stubAccessRights = new
MockRepository.GenerateStub<IAccessRightsManager>();
stubAccessRights.Stub(ar => ar.canUserRead(Arg<IUser>.Is.Anything, confidentialDocument))
.Return(false);
stubAccessRights.Stub(ar => ar.canUserRead(Arg<IUser>.Is.Anything, nonConfidentialDocument))
.Return(true);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.