8

我无法使用 Visual Studio 测试套件和 Moq 为 MvcMailer 成功运行单元测试。我已经从 wiki 逐字复制了这个例子,但每次都得到以下异常:

Test method MvcMailerTest.Tests.MailerTest.TestMethod1 threw exception: 
System.ArgumentNullException: Value cannot be null.
Parameter name: httpContext

代码如下:(使用 VS 单元测试框架 - 使用 nUnit 时的错误与示例中完全相同)

        //Arrange: Moq out the PopulateBody method
        var _userMailerMock = new Mock<UserMailer>();
        _userMailerMock.Setup(mailer => mailer.PopulateBody(It.IsAny<MailMessage>(), "Welcome", null));            
        _userMailerMock.CallBase = true;

        //Act
        var mailMessage = _userMailerMock.Object.Welcome();

Welcome() 方法中的以下行失败(直接从 wiki 复制):

 PopulateBody(mailMessage, viewName: "Welcome");

维基在这里:https ://github.com/smsohan/MvcMailer/wiki/MvcMailer-Step-by-Step-Guide

类似(几乎完全相同)问题:MvcMailer: Can't complete NUnit tests on Razor Views which use Url.Action

有人知道如何解决/解决这个问题吗?链接的问题说我需要模拟我已经完成的 PopulateBody 方法(根据维基)。

4

4 回答 4

3

对 Filip 的回答的快速补充,有人可能会觉得有帮助:我正在使用 MvcMailer 包的 4.0 版。我Populate(Action<MvcMailMessage> action)在我的邮件操作中使用了该方法,并注意到它使用了一个参数版本PopulateBody

// Mvc.Mailer.MailerBase (using ILSpy)
public virtual MvcMailMessage Populate(Action<MvcMailMessage> action)
{
    MvcMailMessage mvcMailMessage = new MvcMailMessage();
    action(mvcMailMessage);

    // Four parameters! (comment added by me)
    this.PopulateBody(mvcMailMessage, mvcMailMessage.ViewName, mvcMailMessage.MasterName, mvcMailMessage.LinkedResources);

    return mvcMailMessage;
}

因此,我发现使用四个参数设置模拟......

PopulateBody(mailMessage, "Welcome", "SomeMasterName", null);

......成功了。

于 2013-03-08T09:04:53.010 回答
2

一种解决方法是将您的代码更改为:

PopulateBody(mailMessage, "Welcome", null);

这将起作用,因为您有一个针对 PopulateBody 重载的模拟设置,而不是它的 2 参数版本。

于 2012-04-22T21:47:02.467 回答
0

您可能也需要模拟 HttpContext 。您可以通过创建一个 HttpContextBase 模拟对象并将其分配给您的 Controller 对象来做到这一点。

于 2011-05-21T10:25:15.170 回答
0

我怀疑这是因为您正在为_userMailerMock变量重新分配一个新的模拟,因此实际上并未模拟该PopulateBody方法。

var _userMailerMock = new Mock<UserMailer>();
_userMailerMock.Setup(mailer => mailer.PopulateBody(It.IsAny<MailMessage>(), "Welcome", null));
_userMailerMock.CallBase = true;

取出_userMailerMock = new Mock<UserMailer>();前一行的第二个作业Callbase = true;

于 2011-05-22T09:42:57.353 回答