rspec / spec / controllers / javascript_controller_spec.rb
pip
controllers / javascript_controller
describe '#show' do
context 'when the javascript can be found' do
subject { get :show, params: { id: javascript.id } }
it { is_expected.to have_http_status(:ok) }
it 'returns the correct body' do
expect(subject.body).to eq(javascript.to_json)
end
end
context 'When the javascript can\'t be found' do
subject { get :show, params: { id: 'blahdeblah' } }
it { is_expected.to have_http_status(:not_found)}
it 'returns an error' do
expect(subject.body).to eq("{\"code\":404,\"message\":\"Javascript with id 'blahdeblah' not found\"}")
end
end
end
所以我的前两个测试通过了,但我的后两个没有通过。
class JavascriptController < ApplicationController
# ...
def show
javascript = Javascript.find(params[:id])
javascript_hash = Rails.cache.fetch(javascript.cache_key) {javascript.as_json }
render json: javascript_hash, status: :ok
end
# ...
end
它实际上为最后两个抛出了两个相同的错误。我正在尝试测试ID是否不在数据库中,然后引发未找到的错误。谁能帮我解决这个问题?
答案 0 :(得分:1)
您正在编写一个控制器规范,这是一个相对较低的规范:它将调用您的控制器动作,但是从那里引发的任何异常(例如ActiveRecord::RecordNotFound
)都会冒泡直接进入您的规格。
要更全面地了解实际请求将发生的情况,请使用请求规范。这将通过整个堆栈传递其请求,然后该异常将转化为某种404响应,就像在生产环境中一样。
答案 1 :(得分:-1)
很抱歉,RTFM除外。如果找不到“ id”,则.find
抛出RecordNotFound。您的控制器在到达渲染行之前引发了错误。
简而言之,测试没有失败。您的控制器不符合测试套件中编写的测试,因此您需要更新控制器代码以使测试通过。这是基本的测试驱动开发(TDD)。更新您的控制器代码,以便所有测试通过。