1

ActionMailer を使用するコードの単体テストを作成しようとしています。テストを作成した後、httpContext パラメーターで System.ArgumentNullException エラーが発生しました。

MailController.cs :

new Mailer().Welcome(new WelcomeModel
{
    Name = "sss",
    Email = model.Email
}).Deliver();

MailControllerTest.cs :

var model = new WelcomeInputModel{ Email = "dsadsa@gmail.com" };
var result = _controller.SendMail(model);
Assert.IsInstanceOfType(result, typeof(RedirectToRouteResult));

どうすればいいですか?

UPDATE、コードを更新しました:

MailControllerTest.cs :

var request = new Mock<HttpRequestBase>();
request.Setup(r => r.HttpMethod).Returns("GET");
_mockHttoContextBase.Setup(c => c.Request).Returns(request.Object);

MailController.cs :

var controller = new MailController {HttpContextBase = _contextBase};
controller.Forgot(new ForgotModel
{
    UserName = membershipUser.UserName, 
    Email = user.Email, 
    Password = membershipUser.ResetPassword()
}).Deliver();

今私が得るエラーは次のとおりです: System.NullReferenceException: オブジェクト参照がオブジェクトのインスタンスに設定されていません。

4

1 に答える 1

0

httpcontext を偽造する必要はありません。コントローラーとActionMailer. 私はあなたにいくつかのラッパーを書きました。

Mailer.cs :

public interface IMailer
{
    void SendMail(string viewName, IEnumerable<string> to, string subject, IEnumerable<string> replayTo);

    void SendMail(string viewName, object model, IEnumerable<string> to, string subject,
        IEnumerable<string> replayTo);

    void SendMail(string viewName, IEnumerable<string> to, string from, string subject, IEnumerable<string> replayTo);

    void SendMail(string viewName, object model, IEnumerable<string> to, string from, string subject,
        IEnumerable<string> replayTo);
}

public class Mailer : MailerBase, IMailer
{
    public void SendMail(string viewName, IEnumerable<string> to, string subject,
        IEnumerable<string> replayTo = null)
    {
        foreach (var email in to)
        {
            To.Add(email);
        }
        Subject = subject;
        if (replayTo != null)
            foreach (var email in replayTo)
            {
                ReplyTo.Add(email);
            }

        Email(viewName).Deliver();
    }

    public void SendMail(string viewName, object model, IEnumerable<string> to, string subject,
        IEnumerable<string> replayTo = null)
    {
        foreach (var email in to)
        {
            To.Add(email);
        }
        Subject = subject;
        if (replayTo != null)
            foreach (var email in replayTo)
            {
                ReplyTo.Add(email);
            }

        Email(viewName, model).Deliver();
    }

    public void SendMail(string viewName, IEnumerable<string> to, string from, string subject,
        IEnumerable<string> replayTo)
    {
        foreach (var email in to)
        {
            To.Add(email);
        }
        From = from;
        Subject = subject;
        if (replayTo != null)
            foreach (var email in replayTo)
            {
                ReplyTo.Add(email);
            }

        Email(viewName).Deliver();
    }

    public void SendMail(string viewName, object model, IEnumerable<string> to, string from, string subject,
        IEnumerable<string> replayTo)
    {
        foreach (var email in to)
        {
            To.Add(email);
        }
        From = from;
        Subject = subject;
        if (replayTo != null)
            foreach (var email in replayTo)
            {
                ReplyTo.Add(email);
            }

        Email(viewName, model).Deliver();
    }
}

ラッパーを使用するには、Ninject または必要なライブラリを使用して彼をバインドし、コントローラーで使用します。

NinjectWebCommon.cs :

_kernel.Bind<IMailer>().To<Mailer>();

MailController.cs :

private readonly IMailer _mailer;

public MailController(IMailer mailer) {
    _mailer = mailer;
}

_mailer.SendMail("Forgot", new ForgotModel
{
    UserName = membershipUser.UserName, 
    Email = user.Email, 
    Password = membershipUser.ResetPassword()
}, new List<string> { model.Email }, _myEmail, "Your password", new List<string>());
于 2014-01-01T15:18:07.023 に答える