2016-01-15 3 views
3

У меня есть контроллер MVC6 со следующей строкой коды:ASP.NET 5 - MVC, 6 - Тест блок контроллер, который использует Url.Action

string link = Url.Action("Profile", "Account"); 

Когда я модульное тестирование этого контроллера, эта линия терпит неудачу с ошибка:

Value cannot be null. 
Parameter name: helper 

Я действительно не хочу, чтобы дразнить ответ Url.Action плюс я не думаю, что я могу, потому что это метод расширения (статический метод). Я хочу, чтобы он запускался и возвращался так, как в веб-среде.

Что мне нужно сделать, создавая экземпляр контроллера в своем модульном тесте, чтобы строка выше выполнялась так, как ожидалось?

Я вижу, что я могу сделать что-то подобное в моем тестовом модуле:

controller.Url = new UrlHelper(new ActionContextAccessor(), new DefaultActionSelector(...)); 

Но я не могу понять, что нужно для настройки ActionContextAccessor и/или DefaultActionSelector (что требует более типов, Я не уверен, где получить или как создать экземпляр).

Кто-нибудь уже это сделал?

Спасибо, Кевин

ответ

5

Моя жена всегда говорит мне, чтобы просто "уйти" от проблемы когда я застрял. И она почти всегда прав.

Поняв, что решение выше не будет работать (потому что это MVC5), я сделал еще один взгляд и понял, что controller.Url - это всего лишь экземпляр IUrlHelper. Я издевался над этим, и poof тесты начали работать. Вот суть того, что я делаю. Это заставило тест выполнить. Я уверен, что могу добавить еще немного к насмешкам, чтобы убедиться, что он функционирует так, как ожидалось.

 Mock<IUrlHelper> urlHelperMock = new Mock<IUrlHelper>(); 
     var controller = new BooksController(); 
     controller.Url = urlHelperMock.Object; 

Да, это было так легко LOL.

Спасибо, Kevin

0

Дано:

namespace SampleWebApplication.Controllers 
{ 
    public class HomeController : Controller 
    { 
     public ActionResult Index() 
     { 
      string link = Url.Action("Profile", "Account"); 
      return View(); 
     } 
    } 
} 

Этот тест, кажется, бежит через OK:

using System; 
using System.Collections.Specialized; 
using System.Web; 
using System.Web.Mvc; 
using System.Web.Routing; 
using Microsoft.VisualStudio.TestTools.UnitTesting; 
using Moq; 
using SampleWebApplication.Controllers; 

namespace SampleUnitTestProject 
{ 
    [TestClass] 
    public class HomeTests 
    { 
     private Mock<HttpRequestBase> RequestMock; 
     private Mock<HttpResponseBase> ResponseMock; 
     private Mock<HttpContextBase> ContextMock; 

     [TestInitialize] 
     public virtual void Setup() 
     { 
      this.RequestMock = new Mock<HttpRequestBase>(); 
      this.ResponseMock = new Mock<HttpResponseBase>(); 
      this.RequestMock.Setup(m => m.QueryString).Returns(new NameValueCollection()); 
      this.RequestMock.Setup(m => m.Url).Returns(new Uri("http://www.somedomain.com")); 
      this.ContextMock = new Mock<HttpContextBase>(); 

      this.ContextMock.Setup(m => m.Request).Returns(this.RequestMock.Object); 
      this.ContextMock.Setup(m => m.Response).Returns(this.ResponseMock.Object); 
     } 

     [TestMethod] 
     public void Test_Index() 
     { 
      // Arrange 

      using (var controller = new HomeController()) 
      { 
       this.RequestMock.Setup(c => c.ApplicationPath).Returns("/tmp/testpath"); 
       this.ResponseMock.Setup(c => c.ApplyAppPathModifier(It.IsAny<string>())).Returns("/mynewVirtualPath/"); 
       var requestContext = new RequestContext(this.ContextMock.Object, new RouteData()); 
       controller.Url = new UrlHelper(requestContext, new RouteCollection()); 

       // Act 
       var result = controller.Index(); 

       // Assert 
      } 
     } 
    } 
} 
+0

Это выглядит как MVC5 (System.Web. *). Я в MVC6 (Microsoft.AspNet. *). – retsvek