2

比較的単純なテストのように見える RSpec テストを作成しようとしていますが、かなりトリッキーであることがわかりました (RSpec は初めてですが)。

簡単に言えば、アプリケーション内のすべてのモデルが :owner または :owners に応答することをテストしたいと考えています。

私の最初の問題は、すべてのモデルをループすることです.RSpecでこれを行う方法は? 通常、次のようなモデルをループできます。

ActiveRecord::Base.descendants.each { |model|
    model.should respond_to :owner
}

しかし、RSpec でこれを正しく行う方法がわかりませんか? テスト内でのループの使用に関するドキュメントはあまり見つかりません。

私の 2 番目の質問は、「OR」句についてです。「所有者または所有者に応答する」にはどうすればよいですか? 何かのようなもの:

model.should respond_to :owner || :owners

しかし、 or 句の使用に関するドキュメントはあまり見つかりません。

4

2 に答える 2

4

各メソッドをテストし、回答をロールアップすることで、OR 条件を達成できます。

ActiveRecord::Base.descendants.each do |model|
   instance = model.new
   expected = instance.respond_to?(:owner) || instance.respond_to?(:owners)
   expected.should be_true
end

しかし、これは私には間違ったにおいがします。:ownerモデルがとの 1 つだけに応答する場合は、モデルが:owners正しいモデルに応答することをテストする必要があります。これが各モデルの仕様を作成し (どのような場合でも必要です)、新しい例を追加することを意味する場合でも、具体的にすることで長期的にはより良い結果が得られます。また、モデル仕様がキャッチオール仕様ではなく、モデル自体の仕様ファイルにあることを期待する、コードの将来のメンテナーにも役立ちます。

この場合、例は非常に小さいです。より長い例については、共有された例を使用して少し DRY することを検討してください。

于 2012-11-01T00:54:50.793 に答える
1

Rspec テストを実行しているときは、まだ Ruby を使用しています。itしたがって、ブロック内にいる限り、ループが機能するはずです。唯一の問題は、モデル オブジェクトがオブジェクトのインスタンスではないため、作成する必要があることです。したがって、1つの解決策は次のとおりです。

it "every model should respond to owners" do

  ActiveRecord::Base.descendants.each { |model|
   model.new.should respond_to :owner
  }

end

or 句についてはよくわかりません。

于 2012-10-31T21:43:45.910 に答える