9

いくつかのモデルとコントローラーを私たちのより大きなプロジェクトに提供することを意図したRailsエンジンがあります。エンジンのダミーアプリ内で多数のモックといくつかのフルスケールモデルとコントローラーを使用して、エンジンが想定どおりに動作し、より大きなアプリケーションで動作することを確認するために、エンジンにはかなりまともな仕様のセットがあります。

ただし、すべてのテストに合格したとしても、大規模なアプリケーションでエンジンを更新すると、動作が壊れていることがよくあります。テストに合格しているのに動作が壊れている場合、明らかにテストに何か問題がありますが、それは何ですか? あざけりすぎですか、それとも十分ではありませんか?

これを理解するために、完全なアプリケーション内からエンジンのテストを実行できるようにしたいと考えています。これは可能であるように思われますが、私は rspec を十分に理解していないため、その方法を理解することができません。

(これはこの質問に関連していますが、まったく同じではありません。完全なアプリ環境内でエンジンの仕様を実行するためだけに、1 つのコマンドからすべての仕様を実行しようとしているわけではありません。これも関連しているようです。実際、私は' 両方でタグ付けされたすべての質問を読みました -- 多くはありませんが、すべて私が必要としているものではないか、未回答です。)

4

1 に答える 1

14

最も簡単な解決策は、rspec コマンドでパスを指定することです。ディレクトリ構造がある場合

/project
/engine
/engine_2

次に、すべてのスペックを実行する必要があります

cd project
rspec spec/ ../engine/spec ../engine_2/spec

しかし、継続的インテグレーションで仕様を実行したい場合、またはこれが快適に思えない場合は、パターン メソッドを変更して、カスタマイズされたrake 仕様タスクでこの問題を解決しました。

lib/task/rspec.rake は次のようになります

require "rspec/core/rake_task"

RSpec::Core::RakeTask.new(:spec)

task :default => :spec
RSpec::Core::RakeTask.module_eval do
  def pattern
    extras = []
    Rails.application.config.rspec_paths.each do |dir|
      if File.directory?( dir )
        extras << File.join( dir, 'spec', '**', '*_spec.rb' ).to_s
      end
    end
    [@pattern] | extras
  end
end

エンジン クラスでは、config.rspec_paths へのパスを追加します。

class Engine < ::Rails::Engine
  # Register path to rspec
  config.rspec_paths << self.root
end

基本プロジェクトのどこかで config.rspec_paths を初期化することを忘れないでください。

ファクトリを追加したい場合は、イニシャライザを作成できます。解決策は、stackoverflow のどこかにあります。

この解決策が最善かどうかはわかりませんが、私にとってはうまくいき、満足しています。幸運を!

于 2012-09-21T16:03:30.780 に答える