2015-02-23 2 views
0

У меня есть следующий метод действий контроллера.Модуль тестирования метода действия контроллера с использованием MOQ

[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, следовательно, возвращая JSON URL-адреса для перенаправления.

Теперь тест явно не работает. Я новичок в модульных тестах и ​​задавался вопросом, какие обновления мне нужно было сделать для Testmethod для его прохождения. Пожалуйста, направляйте меня. Спасибо.

+0

Неисправна ли ошибка? – jackncoke

+0

Метод в репозитории возвращает целое число. Поскольку я MOQing доступ к базе данных, я добавил, что. Ошибка: «Ссылка на объект не установлена ​​в экземпляр объекта.». Эта ошибка возникает, когда я возвращаю JSON –

+0

Да, возникает ошибка. Пожалуйста, проверьте мой предыдущий комментарий. –

ответ

0

Если вы хотите проверить, что Json Result содержит ожидаемый 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); 
} 
Смежные вопросы