Класс UrlHelper выбрасывает нулевое исключение в Asp.net MVC
Я занимаюсь разработкой веб-приложения Asp.net mvc. Я делаю юнит-тест для моего приложения. Я использую Moq, чтобы высмеивать объекты. Я пытаюсь издеваться над классом помощника Url. Я нашел эту ссылку - asp.net mvc: как издеваться над Url.Content("~")?, Используя этот класс, я могу издеваться UrlHelper
класс в юнит-тесте.
Я создал BaseController
как это
public class BaseController : Controller
{
private IUrlHelper _urlHelper;
public new IUrlHelper Url
{
get { return _urlHelper; }
set { _urlHelper = value; }
}
}
Здесь IUrlHelper
Интерфейс / абстракция
public interface IUrlHelper
{
string Action(string actionName);
string Action(string actionName, object routeValues);
string Action(string actionName, string controllerName);
string Action(string actionName, RouteValueDictionary routeValues);
string Action(string actionName, string controllerName, object routeValues);
string Action(string actionName, string controllerName, RouteValueDictionary routeValues);
string Action(string actionName, string controllerName, object routeValues, string protocol);
string Action(string actionName, string controllerName, RouteValueDictionary routeValues, string protocol, string hostName);
string Content(string contentPath);
string Encode(string url);
string RouteUrl(object routeValues);
string RouteUrl(string routeName);
string RouteUrl(RouteValueDictionary routeValues);
string RouteUrl(string routeName, object routeValues);
string RouteUrl(string routeName, RouteValueDictionary routeValues);
string RouteUrl(string routeName, object routeValues, string protocol);
string RouteUrl(string routeName, RouteValueDictionary routeValues, string protocol, string hostName);
}
Я издеваюсь Url.Content()
в модульном тесте, как это
Mock<IUrlHelper> urlHelperMock = new Mock<IUrlHelper>();
urlHelperMock
.Setup(x => x.Content(It.IsAny<string>()))
.Returns<string>(x => "~/" + x);// Mock Content method of Url Helper
Тест успешно пройден и работает нормально. Проблема в том, что я не могу использовать его в режиме реального времени. Я имею в виду, когда я запускаю свое приложение и вызываю Url.Content ("путь"), оно выдает нулевое исключение.
Например
public class ExampleController : BaseController
{
public string GetPath()
{
return Url.Content("~/Path/To/File");
}
}
Url.Content
в этом коде выбрасывает нулевое исключение. Он отлично работает в модульном тесте. Как я могу исправить этот код?
1 ответ
В этом случае действительно нет необходимости абстрагировать UrlHelper
, Просто сделайте макет помощника для теста, чтобы сделать то, что требуется.
Например, предполагая
public class ExampleController : Controller {
public string GetContent() {
return Url.Content("~/Path/To/File");
}
}
Вот тест, который издевается над UrlHelper
используя moq для работы так же, как в оригинальном примере
[TestClass]
public class UrlHelperTest {
[TestMethod]
public void MockUrlHelper() {
//Arrange
var expectedPath = "~/Path/To/File";
var expectedContent = "<p>Fake content here<p>";
var urlHelperMock = new Mock<UrlHelper>();
urlHelperMock
.Setup(m => m.Content(expectedPath))
.Returns(expectedContent)
.Verifiable();
var sut = new ExampleController();
sut.Url = urlHelperMock.Object; //Set mock UrlHelper
//Act
var actualContent = sut.GetContent();
//Assert
urlHelperMock.Verify();
Assert.AreEqual(expectedContent, actualContent);
}
}
Таким образом, теперь можно выполнить тест, а также среда заполнит необходимые свойства контроллера в производственном процессе, поскольку технически ничего не изменилось от исходной платформы до пользовательских абстракций.