【问题标题】:MvcMailer unit test with Rhino Mock, how to?使用 Rhino Mock 进行 MvcMailer 单元测试,如何?
【发布时间】:2011-04-13 03:02:50
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案1】:

    这是我的代码:

    // 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 功能实现它。

    【讨论】:

    • 谢谢 Thomas,您能告诉我 GeneratePartialMock id 与 DynamicMock 有何不同吗?
    • 当一个没有明确定义期望的方法在模拟实例上被调用时,一个普通的模拟对象会抛出一个异常。对于任何意外的方法调用,动态模拟不会引发异常,而是返回 null 或 0。部分模拟和动态模拟一样,如果在没有为方法定义期望的情况下调用方法,则不会抛出异常;但是,部分模拟将调用对象的实际实现方法(即,不是模拟)并返回该值,而不是返回 0 或 null。这使您可以有选择地模拟对象上的特定方法。
    • 这就是为什么我只模拟 PopulateBody 方法并让默认实现完成其余的工作
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多