8

私は RSpec を試していて、テスト スイートに合格した場合にのみランダム シードを変更するシステムを検討しています。after(:suite)オブジェクトのコンテキストで実行されるブロック内でこれを実装しようとしていRSpec::Core::ExampleGroupます。

テストのいずれかが失敗したかどうかを確認できるメソッド「例外」がありますが、例のリストに同様のメソッドまたはアクセサーRSpec::Core::Exampleがないようです。RSpec::Core::ExampleGroupでは、テストが成功したか失敗したかを確認するにはどうすればよいでしょうか?

テストが失敗したかどうかを追跡するカスタム フォーマッタを使用してこれが可能であることは理解していますが、フォーマット プロセスが実際のテストの実行に影響を与えるのは悪い考えのようです。

4

1 に答える 1

8

RSpec のソース コードを調べてみたところ、次のように動作することがわかりました。このコードを、spec_helper.rbまたはテストの実行時に読み込まれる他のファイルに入れるだけです。

RSpec.configure do |config|
  config.after(:suite) do
    examples = RSpec.world.filtered_examples.values.flatten
    if examples.none?(&:exception)
      # change the seed here
    end
  end
end

ハッシュはRSpec.world.filtered_examples、サンプル グループをそのグループのサンプルの配列に関連付けます。Rspec には特定の例を除外する機能があり、このハッシュには実際に実行された例のみが含まれているようです。


システムをセットアップする別の方法の 1 つは、rspec プロセスのリターン コードをチェックすることです。0 の場合、すべてのテストに合格し、シードを変更できます。

シェル スクリプトでは、シードを変更して実行するコマンドを定義できます。

rspec && change_seed

プロジェクトに Rakefile がある場合、次のように設定できます。

task "default" => "spec_and_change_seed"

task "spec" do
  sh "rspec spec/my_spec.rb"
end

task "spec_and_change_seed" => "spec" do
  # insert code here to change the file that stores the seed
end

spec が失敗した場合、rake の「spec」タスクは失敗し、シードの変更は続行されません。

于 2013-09-20T18:36:13.353 に答える