【问题标题】:Test an Asp.Net Controller action method which uses User.Identity.Name?测试使用 User.Identity.Name 的 Asp.Net 控制器操作方法?
【发布时间】:2015-09-03 21:09:20
【问题描述】:

我对 Asp.Net 控制器操作方法有以下测试方法。

[TestMethod]
public void Get()
{
    var controller = new MyController();
    var result = controller.GetAListOfRecords();
    Assert.IsNotNull(result);
    Assert.IsTrue(result.Count() > 0);
}

动作是

[Authorize(Roles = "Users")]
public IQueryable<MyModel> GetAListOfRecords()
{
    var user = User.Identity.Name; // null when called from the test method
    var q = from t in ........
            select t;
    return return string.IsNullOrEmpty(user) ? Enumerable.Empty<MyModel>().AsQueryable() : q;
}

但是,var user = User.Identity.Name 不会在测试类中获取当前用户名(实际上它会被分配一个空字符串)。是否可以在测试方法中设置user

更新: 我在测试类中尝试了以下内容,但 .....Identity.Name 是只读的。

controller.RequestContext.Principal.Identity.Name = @"mdynycmas\wangyi";

【问题讨论】:

  • 我相信是的。但是,我不确定。您是否尝试过在测试项目上配置身份验证?您可以在TestClass 的构造函数中为用户签名。
  • 能否详细介绍一下如何登录测试班?似乎也需要添加所有依赖的 asp.net dll?

标签: c# asp.net unit-testing mstest


【解决方案1】:

实际上,您正在使用 Controller 对象上的 User 属性。此属性正在使用基础 HttpContext.Current。您需要模拟 HttpContextBase 并返回一个测试用户,例如参见 How to mock Controller.User using moq

【讨论】:

    【解决方案2】:

    您需要在单元测试中实现一些模拟。另外我建议您删除对 HttpContext 的直接依赖,并更好地创建一个包装器对象,这样您就可以轻松地模拟它。 See more information in this link 关于这种方法。

    希望对你有帮助!

    【讨论】:

      猜你喜欢
      • 2010-11-26
      • 1970-01-01
      • 2014-09-29
      • 1970-01-01
      • 1970-01-01
      • 2011-01-08
      • 2013-01-28
      • 1970-01-01
      • 2022-08-22
      相关资源
      最近更新 更多