2012-04-28 45 views
0

背景:我们使用MVC4并使用WIF进行声明/授权。我们使用Moq/MvcContrib进行样机对象。我看了here并创建了MockIdentity和MockPrincipal对象 - 我需要它们吗?.Net MVC中的单元测试声明应用程序

目标:我有一个控制器类,它具有仅允许具有“经理”声明的用户访问操作的类级属性。我想创建模拟用户并测试是否有任何没有“经理”声明的人可以访问该操作。

我得到了模拟概念,但我只处理了数据对象嘲讽和困难的时间,弄清楚我需要做什么插件/类/方法/设置。

在此先感谢。

+0

为什么你会测试这个?您将要验证的是MVC自己的基础架构。为什么这对你的应用有价值?如果您的逻辑(而不是MVC)受到Manager声明的影响,情况会有所不同。然后,一个单元测试将是有意义的,并嘲笑校长等将是必要的(如果你打电话给IPrincipal.IsInRole()例如)。 – 2012-04-30 20:26:32

回答

2

我想创建模拟用户并测试是否有人没有“经理”声明可以访问操作。

不,你不知道。您只想将用户传递给您编写的属性并进行测试,即可正确设置filterContext.Result。而已。您不需要测试System.Web.Mvc的工作方式。正在测试的单个单元!

推测你的属性是AuthorizeAttribute,对吗?所以你需要测试OnAuthorization(AuthorizationContext)

免责声明:我没有用过起订量在一段时间,但你的代码大概看起来一般是这样的:

var user = new Mock<IPrincipal>(); 
user.Setup(/* whatever you need to look at */); 

var authContext = new Mock<AuthorizationContext>(); 
authContext.Setup(ac => ac.HttpContext.User).Returns(user); 

var myAttribute = new RequireManagerAttribute(); 
myAttribute.OnAuthorization(authContext); 

authContext.VerifySet(ac => ac.Result = /* whatever you expect */); 
+0

谢谢,我会尝试并报告回来......你可以看看SO样本并告诉我为什么OP在做他在做的事情吗?另外,我什么时候需要MvcContrib? – Pete 2012-04-29 15:45:18

+0

MvcContrib为获得完全初始化的控制器提供了一些帮助。在这种情况下,由于您只是测试属性,所以您不需要。 至于那个人在做什么 - 使用像Roles.AddUserToRole这样的静态方法使得单元测试非常困难。另一个不避免它们的原因。 – bhamlin 2012-04-29 19:29:35