RSpec失败测试

时间:2018-08-14 17:04:19

标签: ruby-on-rails rspec tdd

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是否不在数据库中,然后引发未找到的错误。谁能帮我解决这个问题?

2 个答案:

答案 0 :(得分:1)

您正在编写一个控制器规范,这是一个相对较低的规范:它将调用您的控制器动作,但是从那里引发的任何异常(例如ActiveRecord::RecordNotFound)都会冒泡直接进入您的规格。

要更全面地了解实际请求将发生的情况,请使用请求规范。这将通过整个堆栈传递其请求,然后该异常将转化为某种404响应,就像在生产环境中一样。

答案 1 :(得分:-1)

很抱歉,RTFM除外。如果找不到“ id”,则.find抛出RecordNotFound。您的控制器在到达渲染行之前引发了错误。

简而言之,测试没有失败。您的控制器不符合测试套件中编写的测试,因此您需要更新控制器代码以使测试通过。这是基本的测试驱动开发(TDD)。更新您的控制器代码,以便所有测试通过。