2011-05-05 44 views
5

嘗試運行我在Rails3中項目測試時,使用的MongoDB和Mongoid我得到一個錯誤:未定義的方法`use_transactional_fixtures =」在新的Rails 3項目

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生成我的測試數據,但這並不能解釋這個錯誤。

回答

3

所以這裏的交易: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,所以這沒有任何作用,我必須找到另一種方法在測試運行之間清除數據庫。

+0

也許你已經發現了一個數據庫清洗液......但這個工程的Mongoid:https://github.com/bmabey/database_cleaner – 2011-08-18 18:24:32

1

這裏是一個行黑客可以使用每次測試後刪除所有表:

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

或者像JP指出數據庫清理寶石似乎也爲這項工作: https://github.com/bmabey/database_cleaner

在我的測試中,database_cleaner gem速度提高了約4%,我猜測是因爲它使用了截斷而不是刪除表。下面是一個示例spec_helper.rb文件使用數據庫清理和RSpec

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