视觉效果工作室 2012 单元测试集 user.identity
本文关键字:user identity 单元测试 2012 工作室 视觉 | 更新日期: 2023-09-27 18:34:45
使用 C#,我正在尝试单元测试控制器操作以及它们返回所需的时间。我正在使用VS2012旗舰版中内置的单元测试框架。
不幸的是,我也试图围绕TestContext以及如何使用它。
一些示例代码(我的控制器操作(:
[HttpPost]
public JsonResult GetUserListFromWebService()
{
JsonResult jsonResult = new JsonResult();
WebService svc = new WebService();
jsonResult.Data = svc.GetUserList(User.Identity.Name);
return jsonResult;
}
当我尝试对此进行单元测试时,User.Identity.Name 为 null,因此它会引发异常。我当前的单元测试代码如下所示:
[TestClass]
public class ControllerAndRepositoryActionTests {
public TestContext testContext { get; set; }
private static Repository _repository;
private username = "domain''foobar";
private static bool active = true;
[ClassInitialize]
public static void MyClassInitialize(TestContext testContext)
{
_repository = new WebServiceRepository();
}
#region Controller method tests
[TestMethod]
public void GetUserListReturnsData()
{
Controller controller = new Controller();
var result = controller.GetUserListFromWebService();
Assert.IsNotNull(result.Data);
}
#endregion
#region service repository calls - with timing
[TestMethod]
public void GetUserListTimed()
{
testContext.BeginTimer("Overall");
var results = _repository.GetUserList(username, active);
foreach (var result in results)
{
Console.WriteLine(result.UserID);
Console.WriteLine(result.UserName);
}
testContext.EndTimer("Overall");
}
#endregion
}
我是否可以使用 TestContext 来设置最终将在 GetUserListFromWebService 调用中使用的 User.Identity?
如果可以,分配 TestContext 的可接受方法是什么。当我在MyClassInitialize中将其作为参数获取时,我是否设置了我的成员变量,或者我应该以某种方式将其作为参数传递给TestMethods?
我是否完全错过了重点,我应该使用其他一些模拟框架吗?
为了使这个测试起作用,我应该更改您类的签名。因为不能创建类 Web 服务的存根或模拟,因为您是在方法中创建它的。
class YourClass
{
private readeonly WebService _ws;
public YourClass(WebService ws)
{
_ws=ws;
}
[HttpPost]
public JsonResult GetUserListFromWebService()
{
JsonResult jsonResult = new JsonResult();
jsonResult.Data = _ws.GetUserList(User.Identity.Name);
return jsonResult;
}
}
现在,您可以在测试中轻松地使用Moq或其他框架模拟WebService类。为了使它更容易,你应该创建一个实现方法GetUserList((的类WebService接口;
并嘲笑用户。
public SomeController CreateControllerForUser(string userName)
{
var mock = new Mock<ControllerContext>();
mock.SetupGet(p => p.HttpContext.User.Identity.Name).Returns(userName);
mock.SetupGet(p => p.HttpContext.Request.IsAuthenticated).Returns(true);
var controller = new SomeController();
controller.ControllerContext = mock.Object;
return controller;
}
或阅读这篇博文 http://weblogs.asp.net/rashid/