MvcMailer: Не удается завершить тесты NUnit в Razor Views, которые используют Url.Action - PullRequest
3 голосов
/ 07 апреля 2011

Вот моя проблема - я использую MvcMailer для создания красиво отформатированных писем с использованием синтаксиса Razor, и это отличный инструмент для этого!

Проблема, с которой я сталкиваюсь, заключается вэто - вот некоторый синтаксис из моего представления для одного из писем, которые я отправляю:

<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 (String viewName, String masterName) в Castle.Proxies.Invocations.MailerBase_ViewExists.InvokeMethodOnTarget () в Castle.DynamicProxy.Abject.Inst.1019 * Проблема в том, что мой HttpContext имеет значение null - есть ли простой способ модульного тестирования этого метода MvcMailer без необходимости макетировать все из контекста контроллера на всем пути вниз по результатам маршрута?

Ответы [ 2 ]

4 голосов
/ 08 апреля 2011

Вы можете взглянуть на раздел под названием Unit Test Your Mailers на MvcMailer wiki Все, что вам нужно сделать, это просто смоделировать метод PopulateBody, и тогда он будет обходитьрендеринг вида как часть тестирования.Это должно выглядеть примерно так:

_userMailerMock.Setup(mailer => mailer.PopulateBody(It.IsAny<MailMessage>(), "Welcome", null));

Надеюсь, это поможет!

1 голос
/ 24 февраля 2012

Этот синтаксис работал для меня:

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>>()));
...