8

Visual StudioテストスイートとMoqを使用して、MvcMailerの単体テストを正常に実行できません。ウィキの例を一語一語コピーしましたが、毎回次の例外が発生します。

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

wikiはここにあります:https ://github.com/smsohan/MvcMailer/wiki/MvcMailer-Step-by-Step-Guide

同様の(ほぼ同じ)質問:MvcMailer:Url.Actionを使用するRazorビューでNUnitテストを完了できません

誰かがこれを修正/回避する方法を知っていますか?リンクされた質問は、私が行ったPopulateBodyメソッドをモックアウトする必要があると言っています(wikiによる)。

4

4 に答える 4

3

誰かが役立つかもしれないフィリップの答えへの簡単な追加:私はMvcMailerパッケージのバージョン4.0を使用しています。メーラー アクション内でメソッドを使用していたところ、次の4 つのパラメーター バージョンを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;
}

そのため、4つのパラメーターを使用してモックを設定することがわかりました...

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>();前の行の 2 番目の課題を取り出しますCallbase = true;

于 2011-05-22T09:42:57.353 に答える