这是我的问题-我使用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>>()));