RSpec测试隔离通过,但一起运行时失败 [英] RSpec tests pass in isolation, but fail when run together

查看:56
本文介绍了RSpec测试隔离通过,但一起运行时失败的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在我的 code_controller_spec.rb 中,只要我在 code_controller_spec.rb 中运行测试,我的测试就会通过.但是,当我运行套件时,在 code_controller_spec.rb 中只有 create edit update 测试失败..我真的不确定从那里去哪里,我真的不知道为什么我的测试一起运行时为什么会失败.我有 config.use_transactional_fixtures = false ,并且正在使用 database_cleaner .我的应用通过以下操作在本地运行良好,创建或更新帖子时未收到任何错误.让我知道您是否需要其他信息.

In my code_controller_spec.rb my tests pass when I just run the tests in code_controller_spec.rb. However, when I run the suite, only the create, edit, and update tests fail within code_controller_spec.rb. I'm really not sure where to go from here and I really don't know why my tests fail when running together. I have config.use_transactional_fixtures = false and am using database_cleaner. My app works fine locally with the below actions and I don't receive any errors when creating or updating a post. Let me know if you need additional info.

运行套件时,出现的故障是:

When I run the suite, the failures I get are:

1) CodesController admin pages #create posts a new code post
     Failure/Error:
       post :create, params: {
         code: { 
           created_at: Date.today, 
           title: "Code things", 
           content: "The content of the code post",
           user_id: user.id
         }
       }

     ActionController::UrlGenerationError:
       No route matches {:action=>"create", :code=>{:created_at=>Fri, 20 Oct 2017, :title=>"Code things", :content=>"The content of the code post", :user_id=>1}, :controller=>"codes"}

2)  CodesController admin pages #edit edits a code post
     Failure/Error: get :edit, params: { id: code }

     ActionController::UrlGenerationError:
       No route matches {:action=>"edit", :controller=>"codes", :id=>#<Code id: 1, title: "Code post title", content: "Coding speak that not everyone can understand...", created_at: "2017-10-20 00:00:00", updated_at: "2017-10-21 06:05:27", user_id: 2>}

3) CodesController admin pages #update updates a code post
     Failure/Error: put :update, params: { id: code, code: code2 }

     ActionController::UrlGenerationError:
       No route matches {:action=>"update", :code=>{:title=>"Updated title", :content=>"Updated content"}, :controller=>"codes", :id=>#<Code id: 1, title: "Code post title", content: "Coding speak that not everyone can understand...", created_at: "2017-10-20 00:00:00", updated_at: "2017-10-21 06:05:27", user_id: 2>}

我的 spec/controllers/user/codes_controller_spec.rb

RSpec.describe User::CodesController, type: :controller do

  let!(:user) { User.create(email: "user@example.com", password: "password") }
  let!(:code) { FactoryGirl.create(:code) }

  before do
    sign_in_as user
    expect(response).to have_http_status(:success)
  end

  describe "admin pages" do
    render_views

    context "#create" do
      it "posts a new code post" do
        post :create, params: {
          code: { 
            created_at: Date.today, 
            title: "Code things", 
            content: "The content of the code post",
            user_id: user.id
          }
        }
        expect(response).to redirect_to user_codes_path
        expect(flash[:success]).to eq "Post created successfully."
      end
    end

    context "#edit" do
      it "edits a code post" do
        get :edit, params: { id: code }
        expect(response).to render_template :edit
      end
    end

    context "#update" do
      let(:code2) do 
        { title: "Updated title", content: "Updated content" }
      end
      it "updates a code post" do
        put :update, params: { id: code, code: code2 }
        code.reload
        expect(response).to redirect_to user_code_path(code)
        expect(code.title).to eq code2[:title]
        expect(code.content).to eq code2[:content]
        expect(flash[:success]).to eq "Post updated successfully."
      end
    end
  end
end

我的 spec/factories/post_factories.rb

FactoryGirl.define do
  factory :code do
    created_at Date.today
    title "Code post title"
    content "Coding speak that not everyone can understand..."

    association :user, factory: :user
  end

  factory :life do
    created_at Date.today
    title "Life post title"
    content "The world moves in mysterious ways; whether we want it to..."

    association :user, factory: :user
  end
end

我运行 rspec --seed 123 --bisect ,然后运行该输出,但所有测试都通过了.我应该提一下,我对-bisect 还是很陌生.

I run rspec --seed 123 --bisect and then I run the output of that, but all my tests pass. I should mention I'm very new to --bisect.

这是 rspec --seed 123 --bisect 的输出,当我运行此命令时,所有测试都通过了.

This is the rspec --seed 123 --bisect output and when I run this all my tests pass.

rspec ./spec/controllers/user/codes_controller_spec.rb[1:1:1:1,1:1:2:1,1:1:3:1,1:1:4:1,1:1:5:1] ./spec/controllers/user/lives_controller_spec.rb[1:1:1,1:1:2] ./spec/features/admin_create_posts_spec.rb[1:1,1:2,1:3,1:4] ./spec/features/admin_edit_post_spec.rb[1:1,1:2,1:3] ./spec/features/clearance/user_signs_out_spec.rb[1:1] ./spec/features/clearance/visitor_resets_password_spec.rb[1:1,1:2,1:3,1:4,1:5,1:6] ./spec/features/clearance/visitor_signs_in_spec.rb[1:1,1:2,1:3,1:4,1:5,1:6,1:7,1:8] ./spec/features/clearance/visitor_signs_up_spec.rb[1:1,1:2,1:3,1:4,1:5,1:6,1:7,1:8] ./spec/features/clearance/visitor_updates_password_spec.rb[1:1,1:2,1:3] ./spec/features/homepage_spec.rb[1:1,1:2] ./spec/features/login_users_spec.rb[1:1,1:2] ./spec/features/logout_user_spec.rb[1:1] ./spec/features/showing_all_posts_spec.rb[1:1,1:2] ./spec/helpers/codes_helper_spec.rb[1:1] ./spec/helpers/lives_helper_spec.rb[1:1] ./spec/helpers/user/codes_helper_spec.rb[1:1] ./spec/helpers/user/lives_helper_spec.rb[1:1] ./spec/helpers/users_helper_spec.rb[1:1] ./spec/helpers/welcome_helper_spec.rb[1:1] ./spec/models/code_spec.rb[1:1] ./spec/models/life_spec.rb[1:1]

rails_helper.rb

My database_cleaner config in rails_helper.rb

require database_cleaner

RSpec.configure do |config|
  config.use_transactional_fixtures = false

  # Remove this line if you're not using ActiveRecord or ActiveRecord fixtures
  # config.fixture_path = "#{::Rails.root}/spec/fixtures"

  config.before(:all) do
    FactoryGirl.reload
  end

  # If you're not using ActiveRecord, or you'd prefer not to run each of your
  # examples within a transaction, remove the following line or assign false
  # instead of true.

  config.before(:suite) do
    if config.use_transactional_fixtures?
      raise(<<-MSG)
        Delete line `config.use_transactional_fixtures = true` from rails_helper.rb (or set it to false) to prevent uncommitted transactions being used in JavaScript-dependent specs.
                During testing, the app-under-test that the browser driver connects to uses a different database connection to the database connection used by the spec. The app's database connection would not be able to access uncommitted transaction data setup over the spec's database connection.
      MSG
    end
    DatabaseCleaner.clean_with(:truncation)
  end  

  config.before(:each) do
    DatabaseCleaner.strategy = :transaction
  end

  config.before(:each, type: :feature) do
    # :rack_test driver's Rack app under test shares database connection
    # with the specs, so continue to use transaction strategy for speed.
    driver_shares_db_connection_with_specs = Capybara.current_driver == :rack_test

    if !driver_shares_db_connection_with_specs
      # Driver is probably for an external browser with an app under test that does *not*
      # share a database connection with the specs, so use truncation strategy.
      DatabaseCleaner.strategy = :truncation
    end
  end

  # adds this from
  # https://stackoverflow.com/questions/37753251/actionmailer-not-delivering-confirmation-emails-in-test-environment-rails-4
  config.before(:each, truncation: true) do 
    Database::Cleaner.strategy = :truncation 
  end

  config.before(:each) do
    DatabaseCleaner.start
  end

  config.append_after(:each) do
    DatabaseCleaner.clean
  end
end

已更新铁路路线

Prefix Verb   URI Pattern                             Controller#Action
              root GET    /                                       welcome#index
         passwords POST   /passwords(.:format)                    clearance/passwords#create
      new_password GET    /passwords/new(.:format)                clearance/passwords#new
           session POST   /session(.:format)                      clearance/sessions#create
edit_user_password GET    /users/:user_id/password/edit(.:format) clearance/passwords#edit
     user_password PATCH  /users/:user_id/password(.:format)      clearance/passwords#update
                   PUT    /users/:user_id/password(.:format)      clearance/passwords#update
                   POST   /users/:user_id/password(.:format)      clearance/passwords#create
             users POST   /users(.:format)                        clearance/users#create
           sign_in GET    /sign_in(.:format)                      clearance/sessions#new
          sign_out DELETE /sign_out(.:format)                     clearance/sessions#destroy
                   GET    /sign_out(.:format)                     clearance/sessions#destroy
           sign_up GET    /sign_up(.:format)                      clearance/users#new
        user_lives GET    /user/lives(.:format)                   user/lives#index
                   POST   /user/lives(.:format)                   user/lives#create
     new_user_life GET    /user/lives/new(.:format)               user/lives#new
    edit_user_life GET    /user/lives/:id/edit(.:format)          user/lives#edit
         user_life GET    /user/lives/:id(.:format)               user/lives#show
                   PATCH  /user/lives/:id(.:format)               user/lives#update
                   PUT    /user/lives/:id(.:format)               user/lives#update
                   DELETE /user/lives/:id(.:format)               user/lives#destroy
        user_codes GET    /user/codes(.:format)                   user/codes#index
                   POST   /user/codes(.:format)                   user/codes#create
     new_user_code GET    /user/codes/new(.:format)               user/codes#new
    edit_user_code GET    /user/codes/:id/edit(.:format)          user/codes#edit
         user_code GET    /user/codes/:id(.:format)               user/codes#show
                   PATCH  /user/codes/:id(.:format)               user/codes#update
                   PUT    /user/codes/:id(.:format)               user/codes#update
                   DELETE /user/codes/:id(.:format)               user/codes#destroy
             lives GET    /lives(.:format)                        lives#index
              life GET    /lives/:id(.:format)                    lives#show
             codes GET    /codes(.:format)                        codes#index
              code GET    /codes/:id(.:format)                    codes#show

推荐答案

我相信这是一个自动加载问题.如果您的 :: CodesController Users :: CodesController 之前加载,则您对 Users :: CodesController 的规范实际上是在使用 :::CodesController ,因此无法创建正确的路由.单独运行时,将自动加载正确的类,并且一切正常.要解决此问题,需要在规范开始时使用正确的类.

I believe this is an autoload issue. If your ::CodesController gets loaded before the Users::CodesController then your spec for Users::CodesController is actually using ::CodesController and hence can't create the correct routes. When run singly the correct class is autoloaded and everything works correctly. To fix this require the correct class at the beginning of your spec.

# spec/controllers/user/codes_controller_spec.rb

require 'user/codes_controller'
...

# spec/controllers/codes_controller_spec.rb

require 'codes_controller'
...

这篇关于RSpec测试隔离通过,但一起运行时失败的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆