В Rhino Mocks, как заглушить метод, используя нулевой аргумент?
У меня есть метод canUserRead, который может обрабатывать пустой аргумент как пользователь (потому что иногда пользователи не входят в систему).
Теперь я хочу создать заглушку, поведение которой отражает поведение метода. Я старался:
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 не имеет ссылочной идентичности, поэтому инициализация новой переменной IUser с помощью null не помогает.
Итак, как мне создать метод-заглушку, который возвращает что-то разумное при передаче нулевого аргумента?
3 ответа
Решение
Попробуй это:
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.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);
Я думаю, что вы можете использовать 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);