2011-12-19 34 views
0

我们试图嘲弄使用RhinoMocks 一个MVC 3应用程序的HttpContext的复合材料部件看起来像这样:建立一个结果为一个模拟

HttpContextBase context = mocks.StrictMock<HttpContextBase>(); 
HttpRequestBase request = mocks.PartialMock<HttpRequestBase>(); 
IPrincipal user = mocks.StrictMock<IPrincipal>(); 
HttpCookieCollection cookies = new HttpCookieCollection(); 
IIdentity identity = mocks.StrictMock<IIdentity>(); 
HttpResponseBase response = mocks.PartialMock<HttpResponseBase>(); 

SetupResult.For(response.Cookies).Return(cookies); 
SetupResult.For(context.User).Return(user); 
SetupResult.For(user.Identity).Return(identity); 
SetupResult.For(context.Request).Return(request); 
SetupResult.For(context.Response).Return(response); 
mocks.Replay(context); 

在我的测试,我需要的用户可以使认证我补充如下:“为IIdentity.get_IsAuthenticated()的结果;已设置了”

var identity = context.User.Identity; 
mocks.BackToRecord(identity); 
SetupResult.For(identity.IsAuthenticated).Return(true).Repeat.Any(); 
mocks.Replay(identity); 

然而,这导致 异常被抛出。

为什么?我需要做什么才能在我的测试中进行认证设置?

+0

@帕特里克:我看到你编辑了我的问题,你的改变是什么性质?我找不到任何权利。 – 2011-12-20 08:29:15

+0

如果您点击“编辑xxx小时前”的时间链接,您可以查看修订历史记录(带注释)。您会注意到我在第一个代码示例中修复了代码格式。 – PatrickSteele 2011-12-20 13:05:25

回答

0

它已经,因为我用的记录/重放语义对比的AAA很长一段时间(排列/法/断言)语法,但试穿只是身份模拟做SetupResult

mocks.BackToRecord(identity); 
SetupResult.For(identity.IsAuthenticated).Return(true).Repeat.Any(); 
mocks.Replay(identity); 

NEW回答

摆脱.Repeat.Any()。我认为,因为这是一个属性,你只需要设置返回值。 Rhino.Mocks将始终返回该值 - 您无需告诉它重复。我做了一个快速测试,得到了同样的错误,但是一旦我删除.Repeat.Any(),它就起作用了。

+0

帕特里克感谢您的帮助。我更新了我的代码以反映您的建议。它没有区别,但代码仍然抛出异常 – 2011-12-21 08:25:34

+0

@KSig - 请参阅我的新答案。 – PatrickSteele 2011-12-21 14:47:00

+0

谢谢,现货! :-) – 2011-12-23 12:00:59