【问题标题】:Data persisting with RSpec-rails in a before(:each)在 before(:each) 中使用 RSpec-rails 持久化数据
【发布时间】:2016-01-05 16:18:13
【问题描述】:

我在我的 rails_helper 中设置了事务...

config.use_transactional_fixtures = true

我之前的每个块是这样的:

before(:each) do
  allow(subject).to receive_messages(
    :authenticate => true,
    :authorize => true
  )

@user_song = FactoryGirl.create(:user_song)
FactoryGirl.create(:user_playlist, user_id: @user_song.user_id, 
  album_id: @user_song.song.album_id)

allow_any_instance_of(ApplicationController).to receive_messages(
  :current_user => @user_song.user
)

测试因验证错误而失败,但是,如果我在创建 FactoryGirl 之前为每个使用的模型插入 Model.destroy_all,它就可以工作。我很困惑。

为什么? Rspec rails guide 说应该回滚?是与 FactoryGirl 相关的吗?

【问题讨论】:

    标签: ruby-on-rails ruby rspec factory-bot rspec-rails


    【解决方案1】:
    config.use_transactional_fixtures = true
    

    用于 Rails 内置夹具清理。它与factory_girl 合作。你应该禁用它,然后安装一个像这样的数据库清洁器:https://github.com/DatabaseCleaner/database_cleaner

    【讨论】:

      【解决方案2】:

      尝试配置数据库清理器。

      将此添加到您的 Gemfile 中

      gem 'database_cleaner'
      

      然后更新您的 spec/rails_helper.rb:

      RSpec.configure do |config|
      
        config.before(:suite) do
          DatabaseCleaner.clean_with(:truncation)
        end
      
        config.before(:each) do
          DatabaseCleaner.strategy = :transaction
        end
      
        config.before(:each, :js => true) do
          DatabaseCleaner.strategy = :truncation
        end
      
        config.before(:each) do
          DatabaseCleaner.start
        end
      
        config.after(:each) do
          DatabaseCleaner.clean
        end
      
      end
      

      【讨论】:

        【解决方案3】:

        您需要安装和设置database cleaner gem。正确配置和安装,它将解决您遇到的这个问题。如果 github 阅读我的文档看起来令人困惑,有许多博客文章可以帮助设置和安装。如this文章

        【讨论】:

          猜你喜欢
          • 2013-05-13
          • 2018-01-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-05-19
          • 1970-01-01
          • 2020-10-29
          • 1970-01-01
          相关资源
          最近更新 更多