【问题标题】:Rails/Rspec integration tests with rspec and requests - route not matches for second test带有 rspec 和请求的 Rails/Rspec 集成测试 - 路由与第二次测试不匹配
【发布时间】:2020-06-24 20:08:13
【问题描述】:

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

这很好用:

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::RoutingError: 没有路由匹配 [GET] "/users/2.json"

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

【问题讨论】:

    标签: ruby-on-rails testing rspec specifications


    【解决方案1】:

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

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

    但最佳做法是使用像 factory-bot 和“database-cleaner”这样的 gem。也尝试使用'byebug'。

    【讨论】:

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