2011-05-21 49 views
8

我无法使用visual studio测试套件和Moq成功运行MvcMailer的单元测试。 我从一个字维基字复制的例子,但每次出现以下情况例外:MvcMailer单元测试:System.ArgumentNullException httpContext不能为空

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

上在欢迎()方法将下面的行失败(复制直出维基):

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方法(按照wiki)。

+0

已向MVC Mailer团队报告此问题(https://github.com/smsohan/MvcMailer/issues/20),但未经解决就关闭了。有没有人有解决方法/修复? – jhappoldt 2011-08-25 18:26:47

+0

@Josh,不幸的是,我仍然没有找到解决方法或解决方法。猜猜这个bug是在MVC邮件发送者手中的... – woggles 2011-08-25 19:10:52

+2

解决方法是将您的代码更改为:'PopulateBody(mailMessage,“Welcome”,null);'这会工作,因为您有一个模拟设置PopulateBody的超载,而不是它的2参数版本。 – 2012-02-28 09:50:30

回答

2

行一个解决方法是你的代码改成这样:

PopulateBody(mailMessage, "Welcome", null);

这工作,因为你有一个模拟设置PopulateBody的过载而不是它的2参数版本。

0

你可能也需要模拟HttpContext。你可以通过创建一个HttpContextBase模拟对象并将其分配给你的Controller对象来实现。

+0

我只是试图测试邮件的现在,而不是使用邮件的控制器(如果这有什么区别!)。 – woggles 2011-05-21 12:08:14

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;

+0

糟糕,我将代码错误地粘贴到了stackoverflow中。代码中_userMailerMock只有1个分配。仍然得到相同的错误。 – woggles 2011-05-22 10:51:45

3

快速添加Filip的答案,有人可能会发现有帮助:我正在使用MvcMailer软件包的4.0版本。我用在我的邮件行动Populate(Action<MvcMailMessage> action)方法,发现它使用的PopulateBody一个 -parameter版本:

// 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); 

...做到了。

+0

谢谢! Wiki应该更新为新版本。好工作 – thmshd 2013-04-26 09:29:17

相关问题