【问题标题】:Testing Ruby Gems under Rails在 Rails 下测试 Ruby Gems
【发布时间】:2009-04-06 19:54:05
【问题描述】:

我正在创建一些可以在 Rails 控制器和视图中使用的 gem。我希望能够独立测试宝石。但是我无法弄清楚如何在 gem 中创建 Rails 实例来测试 gem 是否可以在 Rails 应用程序中工作。

我非常喜欢使用 RSpec,但可能会采用 Test::Unit 解决方案,或者只使用 Test::Unit。

我也对 Rails 插件的类似解决方案感兴趣。

(我尝试过谷歌搜索,但“rails gem testing”向我展示了用于测试的 gem,而不是如何测试 gem。我很确定我已经看过关于这个主题的一两篇文章。)

【问题讨论】:

    标签: ruby-on-rails testing rubygems


    【解决方案1】:

    看看其他插件(插件和 gem,同样的东西)测试套件。

    测试增强 Active Record 的插件非常简单。你可以use Active Record anywhere,所以在这种情况下你要做的就是将 Active Record 连接到数据库(例如内存中的 sqlite 数据库)并测试你的 codez。

    # test/test_helper.rb
    $LOAD_PATH << File.join(File.dirname(__FILE__), '..', 'lib')
    require 'your_thing'
    
    ActiveRecord::Base.establish_connection(:adapter => "sqlite3", :database => ":memory:")
    
    ActiveRecord::Schema.define(:version => 1) do
      create_table :posts do |t|
        t.string :title
        t.text :excerpt, :body
      end
    end
    
    class Post < ActiveRecord::Base
      validates_presence_of :title
    end
    
    # test/my_test.rb
    require 'test_helper'
    
    class MyTest < Test::Unit::TestCase
      def test_thing
        # use Post here
      end
    end
    

    当您想要测试控制器操作等时会变得更加困难。 My live validations plugin 有一个相当广泛的测试套件,它模拟了很多东西,让我将 ERb 视图作为字符串传递,你可以看看。

    将这些 Test::Unit 示例改编为 RSpec 应该很简单,因为它们不会搭载 Test::Unit 中的任何内容。

    【讨论】:

    • 这很有帮助;谢谢!有没有办法让 ActiveRecord 保持加载(ala spec_server 或 spork),这样每次加载 ActiveRecord 和创建数据库都不会减慢我的测试速度?
    • 我确信有办法做到这一点。如果您使用 sqlite3 文件存储,而不是像我的实时验证插件使用的内存存储,您可以检查 .sqlite3 数据库文件是否存在,如果存在则不运行迁移等。
    • 这对我来说效果很好,只有几点说明:1)我必须在我的 gemspec 中添加我的测试框架(rspec)和 sqlite3 作为开发依赖项(当然还有 rails 作为运行时依赖项), 2) 在我的测试助手中也需要“rails”和“active_record”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-19
    • 2014-06-07
    • 1970-01-01
    • 2011-06-23
    • 2012-09-16
    • 2011-02-10
    • 1970-01-01
    相关资源
    最近更新 更多