【问题标题】:undefined method `use_transactional_fixtures=' in new Rails 3 project新 Rails 3 项目中未定义的方法“use_transactional_fixtures=”
【发布时间】:2011-10-20 14:04:16
【问题描述】:

尝试使用 MongoDB 和 Mongoid 在 Rails3 项目中运行测试时遇到错误:

undefined method `use_transactional_fixtures=' for ActiveSupport::TestCase:Class

这是一个在 3.0.7 上运行的全新项目。我的 test_helper.rb 文件正是这样的:

ENV["RAILS_ENV"] = "test"
require File.expand_path('../../config/environment', __FILE__)
require 'rails/test_help'

class ActiveSupport::TestCase

  self.use_transactional_fixtures = true

end

这是仅限 ActiveRecord 的方法吗?我在其他也使用 ActiveSupport::TestCase 的 rails 项目中没有这个问题。另外,我正在使用 Fabricator 生成我的测试数据,但这并不能真正解释这个错误。

【问题讨论】:

    标签: ruby-on-rails testing


    【解决方案1】:

    所以这里是交易:use_transactional_filters 是 /rails/test_helper.rb 中定义的一个方法

    module ActiveRecord
      module TestFixtures
        extend ActiveSupport::Concern
    
        included do
    
          class_attribute :use_instantiated_fixtures   # true, false, or :no_instances
        end
      end
    end
    

    所以实际上它是 ActiveRecord 特定的。由于我没有在我的项目中使用 ActiveRecord,所以这没有任何效果,我必须找到另一种方法来在测试运行之间清除我的数据库。

    【讨论】:

    【解决方案2】:

    这是一个单行技巧,可用于在每次测试后删除所有表:

    Mongoid.master.collections.select {|c| c.name !~ /system/ }.each(&:drop) # transactional fixtures hack for mongo
    

    或者正如 JP 指出的那样,数据库清洁器 gem 似乎可以很好地解决这个问题: https://github.com/bmabey/database_cleaner

    在我的测试中,database_cleaner gem 大约快 4%,我猜是因为它使用截断而不是删除表。这是一个使用数据库清理器和 rspec 的示例 spec_helper.rb 文件

      ENV["RAILS_ENV"] ||= 'test'
      require File.expand_path("../../config/environment", __FILE__)
      require 'rspec/rails'
      require 'capybara/rspec'
    
      require 'database_cleaner'
      DatabaseCleaner.strategy = :truncation
    
      # Requires supporting ruby files with custom matchers and macros, etc,
      # in spec/support/ and its subdirectories.
      Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f}
    
      RSpec.configure do |config|
        config.mock_with :mocha
    
        config.before(:each) do
          DatabaseCleaner.clean
          #Mongoid.master.collections.select {|c| c.name !~ /system/ }.each(&:drop) # transactional fixtures hack for mongo
        end
      end
    

    【讨论】:

      猜你喜欢
      • 2013-04-22
      • 2014-12-02
      • 1970-01-01
      • 2012-02-26
      • 1970-01-01
      • 2011-04-22
      • 2016-12-09
      • 2016-06-17
      • 1970-01-01
      相关资源
      最近更新 更多