2011-05-21 48 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

相關問題