asp.net mvc 3 - MvcMailer:无法在使用 Url.Action 的 Razor 视图上完成 NUnit 测试



这是我的问题-我使用MvcMailer使用Razor语法创建格式良好的电子邮件,这是一个很好的工具,用于此!

我遇到的问题是这个-这是我的视图的一些语法为我发送的电子邮件之一:

<p>Click here to return to <a href="@Url.Abs(Url.Action("Details", "Home", new{ Id=ViewBag.IdeaId}))">@ViewBag.IdeaName</a></p>

每当我尝试运行单元测试时,我都会得到以下错误消息:

我们可以发送电子邮件通知新的评论吗?:系统。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.AbstractInvocation.Proceed ()

问题是,我的HttpContext是空的-有一个简单的方法来单元测试这个MvcMailer方法,而不必模拟一切从控制器上下文中一路下来的路由结果?

您可以在MvcMailer wiki上查看标题为Unit Test Your Mailers的部分,您所需要做的就是模拟出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>>()));

相关内容

  • 没有找到相关文章

最新更新