11

アプリにさらに rspec テストを追加していて、/lib/scoring_methods.rb にある ScoringMethods モジュールをテストしたいと考えています。そこで、/spec/lib ディレクトリを追加し、そこに score_methods_spec.rb を追加しました。spec_helper が必要で、describe ブロックを次のように設定しました。

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)
     ...

Expectation と Matcher のサポート全体が欠落しているようです。私の仮定をテストするために、「is_instance_of」を「is_foobar_of」に置き換えて、機能するヘルパー仕様を変更しました。そのテストは単純に失敗し、「is_foobar_of」は対象オブジェクトのメソッドではないと言います。つまり、この Spec::Rails::Example... 階層全体が存在しません。

他のマッチャーも使用してみました。「be_instance_of」などを試しました。rspec ライブラリを適切にインクルードしていないようです。

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

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

4

1 に答える 1

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

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

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

于 2009-06-12T19:42:01.627 に答える