我正在尝试为使用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));该怎么办呢?
更新,我更新了我的代码:
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: object设置为一个对象的实例。
发布于 2014-01-01 15:18:07
您不需要伪造your上下文,只需打破控制器和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>());https://stackoverflow.com/questions/15485344
复制相似问题