2009-04-06 7 views
10

私は、Railsのコントローラとビュー内で使用できるいくつかの宝石を作っています。私は宝石を個別にテストすることができるようにしたいと思います。しかし、宝石がRailsアプリケーションの中で動作することをテストするために、宝石の内部にRailsのインスタンスを作成する方法を理解できませんでした。Ruby Gems Under Railsのテスト

RSpecの使用を強くお勧めしますが、おそらくTest :: Unitソリューションを採用するか、単にTest :: Unitを使用することができます。

私はまた、Railsプラグインと同様のソリューションに興味があります。

(私はグーグルリングを試みましたが、 "レール宝石のテスト"はテストに使用されている宝石を表示していますが、宝石をテストする方法ではありません)。

答えて

12

他のプラグイン(プラグインと宝石、同じもの)のテストスイートを見てください。

アクティブレコードを強化するプラグインのテストは簡単です。 use Active Record anywhereすることができます。その場合、Active Recordをデータベース(たとえば、メモリ内のsqliteデータベース)に接続し、コードをテストするだけです。

# 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の何かにピギーバックしないので、簡単です。

+0

これは非常に役に立ちました。ありがとう! ActiveRecordをロードして(毎回spec_serverまたはspork)ActiveRecordをロードし、毎回データベースを作成してもテストが遅くならないようにする方法はありますか? – Chinasaur

+0

私はそれを行う方法があると確信しています。ライブバリデーションプラグインのようなメモリストレージではなく、sqlite3ファイルストレージを使用している場合は、.sqlite3データベースファイルが存在するかどうかをチェックし、そうでない場合はマイグレーションを実行しないでください。 –

+0

これはかなりうまく機能しました。メモ:1)テストフレームワーク(rspec)とsqlite3を私のgemspec(そしてランタイム依存性としてのレール)に追加する必要がありました。2)テストヘルパーで 'rails'& 'active_record'を必要とする必要がありました。よく –