MvcMailer: Не удается завершить тесты NUnit в Razor Views, которые используют Url.Action
Вот моя проблема - я использую MvcMailer для создания красиво отформатированных писем с использованием синтаксиса Razor, и это отличный инструмент для этого!
Проблема, с которой я сталкиваюсь, заключается в следующем: вот мой синтаксис из моего View для одного из писем, которые я отправляю:
<p>Click here to return to <a href="@Url.Abs(Url.Action("Details", "Home", new{ Id=ViewBag.IdeaId}))">@ViewBag.IdeaName</a></p>
Всякий раз, когда я пытаюсь запустить свои модульные тесты, я получаю следующее сообщение об ошибке:
Можем ли мы отправлять уведомления по электронной почте о новых комментариях?: System.ArgumentNullException: значение не может быть нулевым. Имя параметра: httpContext
Stacktrace - сокращено для краткости, только соответствующие разделы:
в System.Web.Routing.RouteCollection.GetRouteData(HttpContextBase httpContext) по адресу Mvc.Mailer.MailerBase.CreateControllerContext() по адресу Mvc.Mailer.MailerBase.ViewExists(строковое представление viewName, имя_стадии_оценки.) в Castle.DynamicProxy.AbstractInvocation.Proceed()
Проблема в том, что мой HttpContext имеет значение null - есть ли простой способ модульного тестирования этого метода MvcMailer без необходимости макетировать все из контекста контроллера на всем пути вниз по результатам маршрута?
2 ответа
Вы можете взглянуть на раздел под названием Unit Test Your Mailers на вики MvcMailer. Все, что вам нужно сделать, это просто смоделировать метод PopulateBody, и тогда он пропустит рендеринг представления как часть тестирования. Это должно выглядеть примерно так:
_userMailerMock.Setup(mailer => mailer.PopulateBody(It.IsAny<MailMessage>(), "Welcome", null));
Надеюсь это поможет!
Этот синтаксис работал для меня:
var userMailerMock = new Mock<UserMailer> {CallBase = true};
userMailerMock.Setup(mailer => mailer.PopulateBody(It.IsAny<MailMessage>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<Dictionary<string, string>>()));
Возможно, вы захотите посмеяться и над другой перегрузкой (если вышеупомянутое не помогает или просто для уверенности):
userMailerMock.Setup(mailer => mailer.PopulateBody(It.IsAny<MailMessage>(), It.IsAny<string>(), It.IsAny<Dictionary<string,string>>()));