WEBサービス創造記

WEBサービスを作ったり保守したりしてる人のメモブログです。

RSpec3の設定

      2015/12/14

spec_helper(もしくはrails_helper)でのRSpecの設定項目を理解していく。 RSpecのバージョンはで確認。

spec_helper.rbトップレベルでのメソッド

ActiveRecord::Migration.maintain_test_schema!
テストを走らせる前に実行してないmigrationがないかを確認する。具体的には必要に応じてrake db:test:prepareを実行するという振る舞いとなる。 ※なお、rails 4.1 からは rake db:test:prepare が Deprecated になっているがその辺も抽象化してくれていると思われる。

RSpec.configure ブロックでの設定項目

※下記コードでいうconfig.fixture_pathの部分。

RSpec.configure do |config|
  # Remove this line if you're not using ActiveRecord or ActiveRecord fixtures
  config.fixture_path = "#{::Rails.root}/spec/fixtures"
  # ...
end

fixture_path

記述例

RSpec.configure do |config|
  config.fixture_path = "#{::Rails.root}/spec/fixtures"
  # ...
end

意味

ロードするfixtureのパスを指定。 スペック内でfixtures(:all)のように実行するとここのパスで定義されているfixtureを読み込む。

use_transactional_fixtures

記述例

RSpec.configure do |config|
  config.use_transactional_fixtures = true
  # ...
end

意味

テスト内でデータをトランザクション処理するかどうかを指定

yes なら、テスト内でのデータ操作がトランザクションの扱いになり、コミットするまでDBに保存されない。 no なら、トランザクション処理を行わず、INSERTしたタイミングでレコードが保存される。

infer_spec_type_from_file_location!

記述例

RSpec.configure do |config|
  config.infer_spec_type_from_file_location!
  # ...
end

意味

従来のRSpecではspecファイルが配置されているディレクトリから自動的にspecのタイプ(model, controller, feature等)を判別してくれていたが、RSpec3からはその自動判定機能はオフになった。 このオプションを付加することでこの機能を有効にすることができる。

filter_run_excluding

記述例

RSpec.configure do |config|
  config.filter_run_excluding very_slow: true
  # ...
end

意味

指定したメタデータがついているグループやサンプルを実行しないようにする。 例えば、上記例のように記述すると下記のように定義されているグループは実行されないようになる。

describe "group 1", very_slow: true do
  # ...
end

サンプルにも同様に定義可能。

it "example 1", very_slow: true do
  # ...
end

もし意図的に実行したい場合はrspec spec --tag very_slowのようにオプションを付加する。

統括

ActiveRecordに依存する処理(ORMにAR以外を採用している場合は動作しない)は下記のような制御を入れるのがベター

ActiveRecord::Migration.maintain_test_schema! if defined?(ActiveRecord::Migration)
  • Fixture使ってない場合はfixture関連の設定を除去する

 - Ruby , ,