我有一个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";
答案 0 :(得分:0)
实际上,您正在使用Controller对象上的User属性。此属性使用基础HttpContext.Current。您需要模拟HttpContextBase并返回测试用户,例如参见How to mock Controller.User using moq。
答案 1 :(得分:0)
您需要在单元测试中实现一些模拟。另外我建议你删除你对HttpContext的直接依赖,更好地创建一个包装器对象,这样你就可以轻松地模拟它。 docs关于这种方法。
希望它有所帮助!