2016-03-15 59 views
1

我在寫我的測試時遇到了一些困難,看看我的rescue子句中的方法是否被調用。這裏是我的代碼:如何構建我的測試,以便測試我的救援條款?

def run 
    begin 
     fail BounceLimitError, 'Reached 5% Bounce Rate' if Reverification::Process.bounce_limit_reached? 
    rescue 
     Reverification::Process.start_polling_queues 
    end 
    resend_soft_bounced_notifications 
    send_notifications 
    end 

測試文件:

it 'should not invoke notifications sending methods when bounce limit is > 5%' do 
    Reverification::Process.stubs(:bounce_limit_reached?).returns(true) 
    Reverification::Mailer.expects(:send_notifications).never 
    Reverification::Mailer.expects(:resend_soft_bounced_notifications).never 

    assert_raise Reverification::Mailer::BounceLimitError do 
    Reverification::Process.expects(:start_polling_queues) 
    Reverification::Mailer.run 
    end 
end 

我擡起頭來的文件和assert_raise是要走的路,但這個測試產生不滿意的期望。有人能幫我弄清楚如何讓這個測試成功嗎?

-----編輯------

我試着用下面的代碼推薦的變化:

def run 
    fail BounceLimitError, 'Reached 5% Bounce Rate' if Reverification::Process.bounce_limit_reached? 
    resend_soft_bounced_notifications 
    send_notifications 
    rescue 
    Reverification::Process.start_polling_queues 
    end 

it 'should not invoke notifications sending methods when bounce limit is > 5%' do 
    Reverification::Process.stubs(:bounce_limit_reached?).returns(true) 
    Reverification::Mailer.expects(:send_notifications).never 
    Reverification::Mailer.expects(:resend_soft_bounced_notifications).never 
    Reverification::Process.expects(:start_polling_queues) 
    Reverification::Mailer.run 
end 

當我執行測試的錯誤,現在是,這個例外是拋出。

1) Error: 

run#test_0001_should not invoke notifications sending methods when bounce limit is > 5%: 
Reverification::Mailer::BounceLimitError: Reached 5% Bounce Rate 
    lib/reverification/mailer.rb:18:in `run' 
    test/lib/reverification/mailer_test.rb:38:in `block (2 levels) in <class:MailerTest>' 

測試通過這麼說是因爲拋出了一個錯誤,但是我怎樣才能讓它通過?

+0

爲什麼要使用'rescue'?爲什麼不僅僅是'Reverification :: Process.start_polling_queues if Reverification :: Process.bounce_limit_reached?' – PJSCopeland

回答

0

assert_raise不是你想要在這種情況下,因爲你的run方法不會產生這種異常。它在內部從中救出並調用Reverification::Process.start_polling_queues方法。

在您的測試中,調用Reverification::Process.expects(:start_polling_queues)就足以覆蓋該代碼路徑(以及其他方法中的.never)。

即:

  1. Reverification::Process.bounce_limit_reached?返回true
  2. 將引發異常
  3. 該例外被捕獲
  4. Reverification::Process.start_polling_queues

PS:@PJSCopeland好點,你的方法可能不正確。我想這可能是你試圖做:

def run 
    fail BounceLimitError, 'Reached 5% Bounce Rate' if Reverification::Process.bounce_limit_reached? 

    resend_soft_bounced_notifications 
    send_notifications 
rescue BounceLimitError 
    Reverification::Process.start_polling_queues 
end 

如果這樣的作品,我建議這個版本,不依賴於提升和從同樣的方法異常救援:

def run 
    Reverification::Process.start_polling_queues and return if Reverification::Process.bounce_limit_reached? 

    resend_soft_bounced_notifications 
    send_notifications 
end 

這應該通過您的更新單元測試。

+0

感謝您對Lucas的評論,你能看看我的編輯嗎?我更改了代碼以反映您的建議,但仍然出現錯誤。我也像指定一樣去除了assert_raise,但我想我得到了一個錯誤,因爲我已經明確地用'fail'來表示。這是發生了什麼? –

+0

我懷疑你的BounceLimitError沒有擴展'StandardError'。我通常這樣做(BounceLimitError

+0

更新:多一點閱讀,很明顯,您的應用程序級別異常_應該擴展StandardError。我建議你解決這個問題。我仍然會在救援條款中列出'BounceLimitError' - 這只是一種習慣。 –

相關問題