【问题标题】:RSpec Failing testRSpec 测试失败
【发布时间】:2023-03-03 23:38:01
【问题描述】:

rspec/spec/controllers/javascript_controller_spec.rb

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

控制器/javascript_controller

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

所以我的前两个测试通过了,但我的最后两个没有。

 I'm getting the error 1) JavascriptController#show When the javascript 
 can't be found returns an error
 Failure/Error: javascript = Javascript.find(params[:id])

 ActiveRecord::RecordNotFound:
   Couldn't find Javascript with 'id'=blahdeblah

它实际上为最后两个抛出了两个相同的错误。我正在尝试测试 ID 是否不在数据库中,然后抛出未找到错误。谁能帮我解决这个问题?

【问题讨论】:

    标签: ruby-on-rails rspec tdd


    【解决方案1】:

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

    要更全面地了解实际请求会发生什么,请改用请求规范。这将通过整个堆栈传递其请求,然后异常将转换为某种 404 响应,就像在生产中一样。

    【讨论】:

    • 找到记录的请求测试怎么没找到?
    • 这很明显?失败的规范引发了一个未被捕获的异常。
    【解决方案2】:

    很抱歉这么说,但是RTFM.find 抛出 RecordNotFound 如果找不到“id”。您的控制器在到达渲染线之前引发了错误。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多