【问题标题】:RSpec expect HTTP error statusRSpec 期望 HTTP 错误状态
【发布时间】:2015-06-18 18:22:03
【问题描述】:

在这个例子中,我创建了一个项目,然后发送一个帖子来创建另一个同名的项目。正如它应该的那样,它引发了 ActiveRecord::RecordNotUnique。我还想检查它是否返回 409 HTTP 状态,但由于它引发错误,它会自动使测试失败。如何检查它是否返回 409?

require 'rails_helper'

RSpec.describe 'Project Requests', type: :request do

  it 'Refuses duplicate projects' do
    project_1 = FactoryGirl.create(:project)
    post '/projects', name: project_1.name
    expect(response.status).to eq(409)
  end
end

这是 RSpec 输出:

Failures:

  1) Project Requests Refuses duplicate projects
     Failure/Error: post '/projects', name: project_1.name
     ActiveRecord::RecordNotUnique:
       PG::UniqueViolation: ERROR:  duplicate key value violates     unique constraint "index_projects_on_name"
       DETAIL:  Key (name)=(Dr. Brain) already exists.
       : INSERT INTO "projects" ("name", "created_at",     "updated_at") VALUES ($1, $2, $3) RETURNING "id" 

下面是我的第二种方法。我预计会出现错误,并且该部分工作正常,但我无法检查状态,因为它永远不会到达那条线。 (请注意 puts 命令不会在 RSpec 结果中输出任何内容。)

# spec/requests/project_request_spec.rb
require 'rails_helper'

RSpec.describe 'Project Requests', type: :request do

  it 'Refuses duplicate projects' do
    project_1 = FactoryGirl.create(:project)
    expect {
      response = post '/projects', name: project_1.name
      puts("This code is never executed because the line above fails")
      expect(response.status).to eq(409)
    }.to raise_error(ActiveRecord::RecordNotUnique)
  end

end

这是我的 RSpec 输出:

Project Requests
Puts should output text to the console.
  Refuses duplicate projects

无论它返回什么错误代码都会通过,因此即使测试通过,它也不会测试它应该测试的内容。

【问题讨论】:

    标签: ruby-on-rails ruby rspec


    【解决方案1】:

    response 已由 RSpec 在示例上下文中为您提供。而不是将post返回的值分配给一个新的局部变量,只需使用现有的方法:

    it 'Refuses duplicate projects' do
      project_1 = FactoryGirl.create(:project)
      expect { post '/projects', name: project_1.name }.to raise_error(ActiveRecord::RecordNotUnique)
      expect(response.status).to eq(409)
    end
    

    【讨论】:

    • 之所以包含 response= 是因为上面的代码出错了。失败/错误:expect(response.status).to eq(409) NoMethodError: undefined method `status' for nil:NilClass
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-18
    • 1970-01-01
    • 2015-06-08
    • 1970-01-01
    相关资源
    最近更新 更多