【问题标题】:Unit Testing Claims in .Net MVC app.Net MVC 应用程序中的单元测试声明
【发布时间】:2012-04-28 22:29:13
【问题描述】:

背景:我们正在使用 MVC4 并使用 WIF 进行声明/授权。我们将 Moq/MvcContrib 用于样机对象。我查看了 here 并创建了 MockIdentity 和 MockPrincipal 对象 - 我需要它们吗?

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

我了解了模拟概念,但我只处理了模拟数据对象,并且很难弄清楚我需要哪些插件/类/方法/设置来完成我需要做的事情。

提前致谢。

【问题讨论】:

  • 你为什么要测试这个?您将要验证的只是 MVC 自己的基础架构。为什么这对您的应用程序很有价值?如果您的逻辑(不是 MVC)受到 Manager 声明的影响,情况会有所不同。那么单元测试将是有意义的,并且需要模拟 Principal 等(例如,如果您正在调用 IPrincipal.IsInRole())。

标签: asp.net-mvc moq wif mvccontrib authorize-attribute


【解决方案1】:

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

不,你没有。您只想将用户传递给您编写并测试正确设置 filterContext.Result 的属性。而已。您无需测试 System.Web.Mvc 是否有效。正在测试的单个单元!

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

免责声明:我有一段时间没有使用 moq,但您的代码大概看起来像这样:

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 */);

【讨论】:

  • 谢谢,我会尝试并报告...您能否查看 SO 示例并告诉我为什么 OP 正在做他正在做的事情?另外,我什么时候需要 MvcContrib?
  • MvcContrib 为构建完全初始化的控制器提供了一些帮助。在这种情况下,由于您只是在测试属性,因此不需要它。至于那个人在做什么——使用像 Roles.AddUserToRole 这样的静态方法使单元测试变得非常困难。另一个不避免它们的原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-02
  • 1970-01-01
  • 2020-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-11
相关资源
最近更新 更多