视觉效果工作室 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?

是否完全错过了重点,我应该使用其他一些模拟框架吗?

视觉效果工作室 2012 单元测试集 user.identity

为了使这个测试起作用,我应该更改您类的签名。因为不能创建类 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/