3

这是我的问题 - 我正在使用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.AbstractInvocation.Proceed()

问题是我的 HttpContext 是空的 - 有没有一种直接的方法来单元测试这个 MvcMailer 方法,而不必从控制器上下文一直到路由结果模拟所有内容?

4

2 回答 2

4

您可以查看MvcMailer wiki上标题为“对您的邮件程序进行单元测试”的部分。您需要做的就是模拟 PopulateBody 方法,然后它将绕过视图呈现作为测试的一部分。它应该如下所示:

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

希望这可以帮助!

于 2011-04-08T19:52:34.020 回答
1

这种语法对我有用:

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>>()));
于 2012-02-24T11:21:24.367 回答