gpt4 book ai didi

ruby-on-rails - RSpec 忽略了我在 Controller 中的救援 block

转载 作者:行者123 更新时间:2023-12-03 17:41:06 24 4
gpt4 key购买 nike

我有一个 Rails Controller ,它对数据库进行健康检查,如下所示:

def health_check
begin
status = ActiveRecord::Base.connected? ? 'UP' : 'DOWN'
rescue
status = 'DOWN'
end
render text: status
end

我正在尝试为此创建一个 RSpec Controller 规范,并且正面和负面响应的规范都有效,但是当我尝试测试救援 block 时,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 中的两个代码尝试了规范上面的 block (分开)。

首先,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 只是绕过救援 block 而不运行它。这可能是什么原因造成的?我是 不是 使用 bypass_rescue RSpec 方法随处可见,这也是一个新项目。

使用:
Rails 4.2.6
Rake 10.5.0
RSpec-core 3.3.2
RSpec-rails 3.3.3

最佳答案

实际上,这个问题与 rescue 无关。在您的 Controller 中阻止。相反,这是由于您已覆盖 ActiveRecord::Base#connected? 造成的。通过在你的 before 中 stub 堵塞。

调用render在 Controller 中启动与数据库的连接。进程中的某个地方ActiveRecord::Base#connected?被调用(实际上是两次),但不是返回它应该返回的内容,而是引发您在设置中定义的异常。

在您的第一个示例中,异常在您的期望之前引发,因此失败消息中的显式异常名称。

在您的第二个示例中,您的 raise_error 抑制了异常。期望,因此 RSpec 能够进行下一个。它失败的地方是因为 render Controller 中的调用永远不会运行(由于错误),因此,响应主体永远不会有机会被填充。

作为确认 ActiveRecord::Base#connected?当您调用 render 时会被调用,尝试运行以下规范。你会看到它是绿色的,这意味着该方法在这个过程中被调用了两次。您也可以尝试替换renderhead :ok并且会看到在这种情况下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

关于ruby-on-rails - RSpec 忽略了我在 Controller 中的救援 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36071912/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com