2009-06-12 11 views
10

私のアプリにrspecテストを追加しています.ScoringMethodsモジュールは/lib/scoring_methods.rbにあります。だから私は/ spec/libディレクトリを追加し、そこにscoring_methods_spec.rbを追加しました。私はspec_helperを必要とように記述するブロックを設定します。ライブラリモジュールのrspecテストを追加することが期待できないようです。期待とマッチャー

require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') 

describe ScoringMethods do 

    describe "should have scorePublicContest method" do 
    methods = ScoringMethods.instance_methods 
    methods[0].should match(/scorePublicContest/) 
    end 
end 

今すぐmethods[0]は文字列であり、正規表現でのパブリックメソッドの名前と一致する問題はありません。そして、 "spec_helper"への相対パスは正しいです。

セットアップ全体がrspecライブラリを使用していないようです。 例を実行すると、利回り:

./spec/lib/scoring_methods_spec.rb:7: undefined method `match' for Spec::Rails::Example::RailsExampleGroup::Subclass_1::Subclass_1:Class (NoMethodError) 
    ... 

全体の期待とMatcherのサポートが不足しているようです。私の想定をテストするために、 "is_instance_of"を "is_foobar_of"に置き換えて、働くヘルパー仕様を変更しました。そのテストは単に失敗し、 "is_foobar_of"は対象オブジェクトのメソッドではないと言います。それは、この全体のSpec :: Rails :: Example ...階層が存在しないということです。

他のマッチャーも試してみました。私は "be_instance_of"と他のものを試しました。私はrspecライブラリを正しく含めていないようです。

最後に、ScoringMethodsはヘルパーがモジュールであるのと同じようにモジュールです。だから私はモジュールをテストすることが可能であると考えました(コントローラやモデルなどのクラスとは対照的に)。

私が間違っていたことに対するあなたの考えを大変感謝します。ライブラリモジュールをより効果的にテストする方法がありますか?ありがとう!

答えて

11

"it"ブロックにテストブロックを含める必要があります。例:

require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') 

describe ScoringMethods do 

    describe "should have scorePublicContest method" do 
    it "should have a scorePublicContest method" do 
     methods = ScoringMethods.instance_methods 
     methods[0].should match(/scorePublicContest/) 
    end 
    end 
end 

返されるメソッド名は、ファイル内に存在する順序であるとは限りません。

モジュールをテストするときによく使用するモデルは、テスト用に作成されたクラス(仕様ファイル内)または仕様自体の中にモジュールを含めることです。

+1

Mark、 お返事ありがとうございます。あなたは絶対に正しいです!私は "それ"ブロックを持っていませんでした。多くのありがとう、 Peter –

+2

また、モジュールのテストに感謝します。このモジュールは、publicメソッドだけを公開し、instance_methods呼び出しを使用したときに返されるメソッドの巨大なリストを取得しないためにクラスに含まれています。このようにして、新しいパブリックメソッドをモジュールに追加することができ、ドロップダウンリストなどで選択することができます。 同じメカニズムを使用することは、お勧めのとおり、テストに役立ちます。 –

+0

恐ろしく、 'it'ブロックも正しく閉じていませんでした。 –

関連する問題