2013-10-22 40 views
1

我有一个方法canUserRead,它可以作为用户处理一个空参数(因为有时用户没有登录)。在Rhino Mocks中,如何使用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变量并不会有帮助。

那么,如何创建一个存根方法,它在传递一个空参数时返回一些合理的东西?

+0

你用什么版本? NuGet的最新版本不包含* MocksRepository *上的* GenerateStub *方法。 – galenus

+0

@galenus我使用Rhino Mocks 3.6 build 21,从Rhino Mocks网站下载(不是NuGet槽)。这是我在2月份下载的最新版本。 –

+0

据我所知,犀牛直到最近才得到维护。它改变了[今年5月](http://ayende.com/blog/tags/rhino-mocks)。所以你最好从NuGet更新库。 – galenus

回答

2

试试这个:

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); 
1

我想你可以使用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); 
+0

如果这是我所有的存根必须要做的事情,那么我猜想它会起作用。但存根也必须返回true或false为登录用户,我想它不会工作呢?我会用其他条件更新这个问题。尽管知道Is.Anything语法虽然很好,但我可以将所有非机密文档的案例合并为一个 –

+0

我不明白为什么这不起作用 –

+0

请参阅更新的问题。我想同时使用null和具有特定IUser的呼叫。如果我使用Is.Anything进行null调用,我认为它也会覆盖我通过特定IUser的情况。或者RhinoMocks只在未定义特定匹配时才应用更一般的匹配? –

4

我建议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); 
+0

我会接受galenus的解决方案,因为它一直工作。出于某种原因,Arg .Is.Null有时会导致异常(但我可能使用不当)。否则它似乎也是一个很好的解决方案。 –