В 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 не помага.

И така, как да създам метод за мъниче, който връща нещо разумно, когато му бъде подаден нулев аргумент?


person Rumi P.    schedule 22.10.2013    source източник
comment
Каква версия използвате? Последната версия от NuGet не съдържа метода GenerateStub в MocksRepository.   -  person galenus    schedule 22.10.2013
comment
@galenus Използвам Rhino Mocks 3.6 build 21, изтеглен от уебсайта на Rhino Mocks (не чрез NuGet). Това беше текущата версия, когато я изтеглих през февруари.   -  person Rumi P.    schedule 22.10.2013
comment
Доколкото разбрах, Rhino не е бил поддържан доскоро. Промени се този май. Така че по-добре актуализирайте библиотеката от NuGet.   -  person galenus    schedule 22.10.2013


Отговори (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); 
person galenus    schedule 22.10.2013

Бих предложил 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);
person Chris Mantle    schedule 22.10.2013
comment
Ще приема решението на galenus, защото работи последователно. По някаква причина Arg‹IUser›.Is.Null понякога предизвикваше изключение (но може да съм го използвал неправилно). Иначе също изглежда като добро решение. - person Rumi P.; 22.10.2013

Мисля, че можете да използвате синтаксиса 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); 
person Christian Hagelid    schedule 22.10.2013
comment
Ако това беше всичко, което моята мъничка трябваше да направи, предполагам, че щеше да работи. Но мъничето също трябва да връща true или false за влезли потребители, предполагам, че тогава няма да работи? Ще актуализирам въпроса с другите условия. Все пак е добре да знаете за синтаксиса Is.Anything, мога да обединя всички случаи за неповерителен документ в един - person Rumi P.; 22.10.2013
comment
Вижте актуализирания въпрос. Искам да имам едновременно повикване с null и повикване с конкретен IUser. Ако използвам Is.Anything за нулевото извикване, предполагам, че ще обхване и случая, в който подавам конкретен IUser. Или RhinoMocks прилага само по-общо съвпадение, когато няма определено конкретно съвпадение? - person Rumi P.; 22.10.2013