3

これが私の問題です - 私はMvcMailerを使用して、Razor 構文を使用して適切にフォーマットされた電子メールを作成しています。これは、そのために使用する優れたツールです!

私が直面している問題はこれです-これは私が送信した電子メールの1つに対する私のビューからのいくつかの構文です:

<p>Click here to return to <a href="@Url.Abs(Url.Action("Details", "Home", new{ Id=ViewBag.IdeaId}))">@ViewBag.IdeaName</a></p>

単体テストを実行しようとすると、次のエラー メッセージが表示されます。

新しいコメントの電子メール通知を送信できますか?: System.ArgumentNullException : 値を null にすることはできません。パラメータ名: httpContext

Stacktrace - 簡潔にするために短縮されています。関連するセクションのみ:

System.Web.Routing.RouteCollection.GetRouteData (HttpContextBase httpContext) で Mvc.Mailer.MailerBase.CreateControllerContext() で Mvc.Mailer.MailerBase.ViewExists (文字列 viewName、文字列 masterName) で Castle.Proxies.Invocations.MailerBase_ViewExists.InvokeMethodOnTarget ( ) Castle.DynamicProxy.AbstractInvocation.Proceed() で

問題は、私の HttpContext が null であることです。コントローラー コンテキストからルート結果まですべてをモックすることなく、この MvcMailer メソッドを単体テストする簡単な方法はありますか?

4

2 に答える 2

4

MvcMailer wikiのUnit Test Your Mailersというタイトルのセクションを参照してください。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 に答える