2011-04-13 67 views
2

在一個新項目中,我們使用MvcMailer,這很好,我想知道如何使用Rhino和NUnit來測試它?還有一個post on SOgood Wiki page,但這不是我要找的。對於我的控制器我usualy與測試他們MvcContrib's TesthelperMvcMailer單元測試與Rhino Mock,如何?

  • 我試試先嘲笑郵件類,但如果我這樣做,我不能與PopulateBody方法驗證我ViewBag數據,我有問題,我不得不建立我自己的IMailerBase接口
  • 我嘗試在這之後測試郵件程序,因爲我使用MvcContrib控制器,但它只接受InitializeController()中的Controller對象,所以它沒有工作。
  • MailerBase.cs class還有一個IsTestModeEnabled屬性,但是當我測試它時,我在空的URI上出現錯誤。

不知道什麼是最好的辦法做到這一點,我在尋求幫助,謝謝大家!

回答

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("[email protected]", "4454-8838-73773"); 

    // assert 
    Assert.AreEqual(string.Format(Login.mailBody, "4454-8838-73773"), passwordMailer.ViewBag.Body); 
    Assert.AreEqual(Login.mailSubject, mailMessage.Subject); 
    Assert.AreEqual("[email protected]", mailMessage.To.First().ToString()); 

正如你可以看到它,你可以使用partialMock functionnality從犀牛實現它。

+0

謝謝托馬斯,你能告訴我如何GeneratePartialMock ID不同於DynamicMock? – VinnyG 2011-06-14 14:38:53

+1

正常的模擬對象將在模擬實例上調用沒有定義明確期望的方法時引發異常。動態模擬,而不是拋出異常,將返回null或0爲任何意外的方法調用。如果在沒有爲方法定義期望的情況下調用方法,則部分模擬(如動態模擬)不會拋出異常;但是,部分模擬不會返回0或null,而是會調用對象的實際實現方法(即不是模擬)並返回該值。這可讓您選擇性地模擬對象上的特定方法。 – 2011-06-14 19:18:47

+0

這就是爲什麼我只模擬PopulateBody方法並讓默認實現完成剩下的工作 – 2011-06-14 19:21:01