0

使用C#我試圖單元測試控制器的操作和時間需要多長時間才能返回。我正在使用VS2012 Ultimate內置的單元測試框架。Visuals Studio 2012單元測試設置user.identity

不幸的是我也想換行我周圍的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?

我完全忽略了這一點,應該使用其他一些嘲諷框架嗎?

回答

0

爲了使這個測試工作,我應該改變你的班級的簽名。因爲您無法爲您的課程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的接口;

而嘲笑User.Identy

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/

相關問題