簡體   English   中英

RSpec 忽略了我在控制器中的救援塊

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM