测试使用User.Identity.Name?

时间:2015-09-03 21:09:21

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

我有一个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";

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

希望它有所帮助!