2015-02-23 61 views
0

我有以下控制器操作方法。使用起訂量測試控制器操作方法的單元

[HttpPost] 
    public ActionResult CreateProvider(Provider provider) 
    { 
     try 
     { 
      int providerCreationSuccessful = _repository.CreateProvider(provider); 
      if (providerCreationSuccessful == 2) 
       TempData["userIntimation"] = "Provider Registered Successfully"; 

      //return RedirectToAction("ShowTheListOfProviders"); 
     } 
     catch (Exception Ex) 
     { 
      _logger.Error(Ex.Message); 
      return View("Error"); 
     } 
     return Json(new { url = Url.Action("ShowTheListOfProviders", "Provider") }); 
    } 

我已經寫了下面的測試案例上面的方法,其中正在

[TestMethod()] 
    public void CreateProviderTest() 
    { 
     mockProviderRepository.Setup(provider => provider.CreateProvider(_provider)).Returns(new int()); 
     var providerCreationResult = _providerController.CreateProvider(_provider) as ActionResult; 
     Assert.IsNotNull(providerCreationResult); 
    } 

。從我的行動方法的代碼可以看出,我使用AJAX重定向,因此返回要重定向到的URL的JSON。

現在,測試顯然是失敗的。我是單元測試新手,想知道,我需要對Testmethod做什麼更新以便通過。請引導我。謝謝。

+0

是否有錯誤被拋出? – jackncoke 2015-02-23 17:42:07

+0

存儲庫中的方法返回一個整數。由於我是MOQing數據庫訪問,所以我添加了該錯誤。「錯誤是」對象引用未設置爲對象的實例。「。此錯誤在我返回JSON的地方引發 – 2015-02-23 17:45:04

+0

是的,有一個錯誤被拋出。請檢查我以前的評論。 – 2015-02-23 17:59:59

回答

0

如果您想測試Json結果包含期望的URL,您可以編寫一個如下所示的測試。

[TestMethod] 
public void CreateProvider_Execute_EnsureJsonContainsExpectedUrl() 
{ 
    var context = new Mock<HttpContextBase>(); 
    var request = new Mock<HttpRequestBase>(); 
    var response = new Mock<HttpResponseBase>(); 

    context.Setup(ctx => ctx.Request).Returns(request.Object); 
    context.Setup(ctx => ctx.Response).Returns(response.Object); 
    request.SetupGet(x => x.ApplicationPath).Returns("/"); 
    request.SetupGet(x => x.Url).Returns(new Uri("http://localhost/a", UriKind.Absolute)); 
    response.Setup(x => x.ApplyAppPathModifier(It.IsAny<string>())).Returns<string>(x => x); 

    context.SetupGet(x => x.Request).Returns(request.Object); 
    context.SetupGet(x => x.Response).Returns(response.Object); 
    RouteConfig.RegisterRoutes(new RouteCollection()); 

    var repoStub = new Mock<IRepository>(); 
    repoStub.Setup(x => x.CreateProvider(new Provider())).Returns(1); 

    var sut = new HomeController(repoStub.Object, new Mock<ILogger>().Object); 

    sut.Url = new UrlHelper(new RequestContext(context.Object, new RouteData()), routes); 

    var result = sut.CreateProvider(new Provider()) as JsonResult; 
    var actualUrl = GetValueFromJsonResult<string>(result, "url"); 
    Assert.AreEqual<string>("/Provider/ShowTheListOfProviders", actualUrl); 
} 


private T GetValueFromJsonResult<T>(JsonResult jsonResult, string propertyName) 
{ 
    var property = 
     jsonResult.Data.GetType().GetProperties() 
       .Where(p => string.Compare(p.Name, propertyName) == 0) 
       .FirstOrDefault(); 

    if (null == property) 
       throw new ArgumentException("propertyName not found", "propertyName"); 
      return (T)property.GetValue(jsonResult.Data, null); 
}