【发布时间】: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