[英]RSpec is ignoring my rescue block in controller
我有一個 Rails 控制器,它對數據庫進行健康檢查,如下所示:
def health_check
begin
status = ActiveRecord::Base.connected? ? 'UP' : 'DOWN'
rescue
status = 'DOWN'
end
render text: status
end
我正在嘗試為此創建 RSpec 控制器規范,並且正面和負面響應的規范都有效,但是當我嘗試測試救援塊時,RSpec 似乎忽略了它:
RSpec.describe(HealthCheckController) do
context 'When the check raises an exception' do
before :each do
allow(ActiveRecord::Base).to receive(:connected?).and_raise(OCIException) # Using Oracle
end
it 'should render text DOWN' do
# First attempt
get :health_check
expect(response.body).to eq 'DOWN'
# Second attempt
expect { get :health_check }.to raise_error
expect(response.body).to eq 'DOWN'
end
end
end
我用上面it
塊中的兩個代碼(單獨地)嘗試了規范。
首先,RSpec 失敗了:
Failure/Error: get :health_check
OCIException:
OCIException
對於第二個,它也失敗了,取而代之的是這個更“熟悉”的消息:
Failure/Error: expect(response.body).to eq 'DOWN'
expected: "DOWN"
got: ""
(compared using ==)
我還檢查了響應返回的 HTTP 代碼,它是 200,所以響應本身沒問題,沒有 500 錯誤。
就好像 RSpec 只是繞過了救援塊而不是運行它。 什么可能導致這種情況? 我沒有在任何地方使用bypass_rescue
RSpec 方法,這也是一個新項目。
使用:
Rails 4.2.6
Rake 10.5.0
RSpec-core 3.3.2
RSpec-rails 3.3.3
實際上,問題與控制器中的rescue
塊無關。 相反,這是由於您覆蓋了ActiveRecord::Base#connected?
通過在你的before
塊中存根。
在控制器中調用render
啟動到數據庫的連接。 ActiveRecord::Base#connected?
進程中的某個地方ActiveRecord::Base#connected?
被調用(實際上是兩次),但不是返回它應該返回的內容,而是引發您在設置中定義的異常。
在您的第一個示例中,異常是在您的預期之前引發的,因此是失敗消息中的顯式異常名稱。
在您的第二個示例中,您的raise_error
期望抑制了異常,因此 RSpec 能夠繼續進行下一個。 由於控制器中的render
調用從未運行(由於錯誤)而失敗的地方,因此,響應正文永遠不會有機會被填充。
作為確認ActiveRecord::Base#connected?
當您調用render
時確實會被調用,請嘗試運行以下規范。 你會看到它是綠色的,這意味着該方法在這個過程中被調用了兩次。 你也可以嘗試用head :ok
替換render
並且會看到在這種情況下ActiveRecord::Base#connected?
只被調用一次。
RSpec.describe ApplicationController do
controller do
def index
render json: ''
end
end
specify 'test' do
expect(ActiveRecord::Base).to receive(:connected?).twice
get :index
end
end
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.