【问题标题】:Tests within Gem need to test migration generator and apply migrations for testsGem 中的测试需要测试迁移生成器并应用迁移进行测试
【发布时间】:2012-03-30 05:39:57
【问题描述】:

我正在开发一个 Gem,其中包含一个迁移生成器和一堆模型、类等,这些模型、类等利用作为迁移的一部分创建的表。

虽然测试迁移生成器本身很容易 - 有很多教程可以完成,但我想要解决的是如何在测试数据库上实际运行迁移,以便我以后可以测试 gem与测试数据交互?

由于 gem 没有 schema.rb,我不知道该怎么做。

【问题讨论】:

    标签: ruby testing tdd gem rails-migrations


    【解决方案1】:

    这就是我在代码中运行迁移的方式;

      ActiveRecord::Base.establish_connection(:adapter => "sqlite3", :database => ":memory:")
      ActiveRecord::Migration.verbose = false
    
      @migration  = Class.new(ActiveRecord::Migration) do
    
        def change
          create_table :users, :force => true do |t|
            t.string     :roles_mask
          end
          create_table :user_without_roles, :force => true do |t|
            t.string     :roles_mask
          end
          create_table :user_without_role_masks, :force => true do |t|
          end
        end
    
      end
    
      @migration.new.migrate(:up)
    

    如果您有一个包含生成的迁移的字符串,您可以在测试设置中执行类似的操作;

      ActiveRecord::Base.establish_connection(:adapter => "sqlite3", :database => ":memory:")
      ActiveRecord::Migration.verbose = false
    
      # Or however you intend to grab the output of the migration generator
      migration_string = ERB.new(File.read(<file name here>)).result
    
      migration  = Class.new(ActiveRecord::Migration)
      migration.class_eval(migration_string)
      migration.new.migrate(:up)
    

    这应该会使用您生成的迁移为您提供一个迁移的数据库。

    【讨论】:

      【解决方案2】:

      你可以这样做:

      我假设您正在使用 ActiveRecord。因此,在您的测试助手中,您应该设置一个内存数据库:

      require 'active_record'
      
      # Connection must be establised before anything else
      ActiveRecord::Base.establish_connection(
        :adapter => defined?(JRUBY_VERSION) ? 'jdbcsqlite3' : 'sqlite3',
        :database => ':memory:'
      )
      

      然后在您的测试中调用 rake 任务。这看起来像:

      require 'rake'
      requie File.expand_path('../Rakefile', __FILE__) # you'll need to modify this path to actually point to the Rakefile
      
      Rake::Task['db:migrate'].invoke
      

      rake taks 调用未经测试,但这应该会为您指明正确的方向。

      另一种选择是只运行命令:

      %x{rake db:migrate}
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多