首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ActionMailer FakeHttpContext

ActionMailer FakeHttpContext
EN

Stack Overflow用户
提问于 2013-03-18 19:34:34
回答 1查看 215关注 0票数 1

我正在尝试为使用ActionMailer的代码创建单元测试,在编写测试之后,我获得了httpContext参数的System.ArgumentNullException错误。

MailController.cs

代码语言:javascript
复制
new Mailer().Welcome(new WelcomeModel
{
    Name = "sss",
    Email = model.Email
}).Deliver();

MailControllerTest.cs

代码语言:javascript
复制
var model = new WelcomeInputModel{ Email = "dsadsa@gmail.com" };
var result = _controller.SendMail(model);
Assert.IsInstanceOfType(result, typeof(RedirectToRouteResult));

该怎么办呢?

更新,我更新了我的代码:

MailControllerTest.cs

代码语言:javascript
复制
var request = new Mock<HttpRequestBase>();
request.Setup(r => r.HttpMethod).Returns("GET");
_mockHttoContextBase.Setup(c => c.Request).Returns(request.Object);

MailController.cs

代码语言:javascript
复制
var controller = new MailController {HttpContextBase = _contextBase};
controller.Forgot(new ForgotModel
{
    UserName = membershipUser.UserName, 
    Email = user.Email, 
    Password = membershipUser.ResetPassword()
}).Deliver();

现在我得到的错误是: System.NullReferenceException: object设置为一个对象的实例。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-01-01 15:18:07

您不需要伪造your上下文,只需打破控制器和ActionMailer之间的依赖即可。我给你写了些包装纸。

Mailer.cs

代码语言:javascript
复制
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

代码语言:javascript
复制
_kernel.Bind<IMailer>().To<Mailer>();

MailController.cs

代码语言:javascript
复制
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>());
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15485344

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档