由于一个奇怪的原因,Rspec测试失败

时间:2017-02-20 22:44:03

标签: ruby-on-rails testing rspec database-cleaner

我有以下RSpec测试:

describe 'regular user' do
  let!(:organization) { FactoryGirl.create(:full_organization) }
  let(:user) { create(:user, organization: organization) }

  context 'no access' do
    before do
      sign_in user
      binding.pry # debug
      get(suggestions_path)
    end

    it { expect(response).to have_http_status(:redirect) }
  end
end

如果我在没有其他测试的情况下运行它会正常工作,但如果我运行所有测试它就会失败。我不知道怎么会受到影响。我有DatabaseCleaner,具有以下设置:

  config.before(:all) do
    DatabaseCleaner.clean_with :truncation  # clean DB of any leftover data
    Rails.application.load_seed
  end

  config.before(:suite) do
    DatabaseCleaner.strategy = :transaction
    DatabaseCleaner.clean_with(:truncation)
  end

  config.around(:each) do |example|
    DatabaseCleaner.cleaning do
      example.run
    end
  end

好的,我们在binding.pry行,我们有一个用户:

$ user.inspect
#<User id: 15, organization_id: 1, (...params...)>

但是,如果我们输入get(suggestions_path),则此测试会因此错误而失败:

  

$ get(suggestions_path)

     

Module :: DelegationError:用户#used_trial?委托给   organization.used_trial?,但组织是零:用户ID:38,   电子邮件:“person482@example.com”,organization_id:16,(... params ...)   来自... / app / models / user.rb:34:在`救援中   used_trial?“

如果我再次运行它,它可以正常工作:

  

的get(suggestions_path)   =&GT; 302

ID = 38的用户不存在,看起来像是被DatabaseCleaner删除了。但是我不知道为什么它在我得到(suggestions_path)请求时仍然存在。

我尝试过config.cache_classes = false但它仍然失败:(

1 个答案:

答案 0 :(得分:0)

好的,我已经解决了这个问题。

我删除了所有规格,直到我得到此错误的最小设置规格。

然后我尝试逐行删除,直到找到导致此问题的行:那是sign_in user行。

我在rails_helper.rb中添加了以下代码:

  config.after :each do
    Warden.test_reset!
  end

现在工作正常。