带有 rspec 和请求的 rails/rspec 集成测试 - 路由与第二次测试不匹配



我不明白为什么我的第二个测试不起作用。

这工作得很好:

require 'rails_helper'
require 'spec_helper'
RSpec.configure do |config|
config.include Devise::Test::IntegrationHelpers
end
RSpec.describe 'GET /users/:id', type: :request do
before(:all) do
@user = User.find_by(email: "user@dev.test")
sign_in @user
end

it "returns a user object" do
get "/users/#{@user.id}.json"
expect(response.status).to eq 200
expect(response).to have_http_status(:success) 
expect(response.content_type).to eq("application/json; charset=utf-8")
expect(JSON.parse(response.body)["successful"]).to eql(true)
end
end

但是,如果我像这样在同一测试中添加第二个请求:

require 'rails_helper'
require 'spec_helper'
RSpec.configure do |config|
config.include Devise::Test::IntegrationHelpers
end
RSpec.describe 'GET /users/:id', type: :request do
before(:all) do
@user = User.find_by(email: "user@dev.test")
sign_in @user
end

it "returns a user object" do
get "/users/#{@user.id}.json"
expect(response.status).to eq 200
expect(response).to have_http_status(:success) 
expect(response.content_type).to eq("application/json; charset=utf-8")
expect(JSON.parse(response.body)["successful"]).to eql(true)
end
it "returns another user object" do
get "/users/#{@user.id}.json"
expect(response.status).to eq 200
expect(response).to have_http_status(:success) 
expect(response.content_type).to eq("application/json; charset=utf-8")
expect(JSON.parse(response.body)["successful"]).to eql(true)
end
end

测试失败并显示错误: ActionController::routeingError: no route match [GET] "/users/2.json">

如您所见,两个测试是相同的,但由于某种原因,第二个测试总是失败。

我认为这是因为测试环境中没有第二个用户。 像这样添加第二个用户

before(:all) do
@user_second = User.create(user_params)
...
end

但最佳做法是使用工厂机器人和"数据库清理器"等 gem。也尝试使用"byebug"。

最新更新