用Rhino Mock进行MvcMailer单元测试,怎么样?

时间:2011-04-13 03:02:51

标签: c# asp.net-mvc-3 nunit rhino-mocks mvcmailer

在一个新项目中,我们使用MvcMailer,它很棒,我想知道如何使用Rhino和NUnit测试它?还有一个post on SO和一个good Wiki page,但这不是我想要的。对于我的控制器,我通常用MvcContrib's Testhelper

测试它们
  • 我首先尝试模拟邮件程序类,但如果我这样做,我无法验证我的ViewBag数据,我遇到了PopulateBody方法的问题,我必须构建自己的IMailerBase接口
  • 我尝试使用MvcContrib对控制器进行测试,但是它只接受InitializeController()中的Controller对象,所以它不起作用。
  • MailerBase.cs class中还有一个IsTestModeEnabled属性,但是当我对它进行测试时,我在空URI上收到错误。

不知道最好的方法是什么,我正在寻求帮助,谢谢大家!

1 个答案:

答案 0 :(得分:4)

以下是我是如何做到的代码:

// arrange
    var passwordMailer = MockRepository.GeneratePartialMock<PasswordMailer>();
    passwordMailer.Stub(mailer => mailer.PopulateBody(Arg<MailMessage>.Is.Anything, Arg.Is("ForgotPassword"), Arg<string>.Is.Null, Arg<Dictionary<string, string>>.Is.Null));

    // act
    var mailMessage = passwordMailer.ForgotPassword("test@example.com", "4454-8838-73773");

    // assert
    Assert.AreEqual(string.Format(Login.mailBody, "4454-8838-73773"), passwordMailer.ViewBag.Body);
    Assert.AreEqual(Login.mailSubject, mailMessage.Subject);
    Assert.AreEqual("test@example.com", mailMessage.To.First().ToString());

正如您所看到的,您可以使用Rhino的partialMock functionnality来实现它。