Rspec-core: 共有グループで単一の仕様を分離して実行する方法があるはずです

作成日 2010年07月20日  ·  10コメント  ·  ソース: rspec/rspec-core

これは、共有スペックグループを使用するスペックスイート全体を実行して得られたバックトレースの例です。

8)
RuntimeError in 'Arel Join#each iterates over the rows in any order'

/Users/apatterson/git/arel/spec/../lib/arel/algebra/relations/operations/join.rb:14:in `hash'
/Users/apatterson/git/arel/spec/../lib/arel/session.rb:38:in `[]'
/Users/apatterson/git/arel/spec/../lib/arel/session.rb:38:in `read'
/Users/apatterson/git/arel/spec/../lib/arel/algebra/relations/relation.rb:21:in `each'
/Users/apatterson/git/arel/spec/support/matchers/have_rows.rb:5:in `have_rows'
/Library/Ruby/Gems/1.8/gems/rspec-1.3.0/lib/spec/matchers/simple_matcher.rb:16:in `call'
/Library/Ruby/Gems/1.8/gems/rspec-1.3.0/lib/spec/matchers/simple_matcher.rb:16:in `matches?'
/Library/Ruby/Gems/1.8/gems/rspec-1.3.0/lib/spec/expectations/handler.rb:11:in `handle_matcher'
/Library/Ruby/Gems/1.8/gems/rspec-1.3.0/lib/spec/expectations/extensions/kernel.rb:27:in `should'
/Users/apatterson/git/arel/spec/shared/relation_spec.rb:23:
/Library/Ruby/Gems/1.8/gems/rspec-1.3.0/lib/spec/example/example_methods.rb:40:in `instance_eval'
/Library/Ruby/Gems/1.8/gems/rspec-1.3.0/lib/spec/example/example_methods.rb:40:in `execute'
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/timeout.rb:53:in `timeout'
/Library/Ruby/Gems/1.8/gems/rspec-1.3.0/lib/spec/example/example_methods.rb:37:in `execute'
/Library/Ruby/Gems/1.8/gems/rspec-1.3.0/lib/spec/example/example_group_methods.rb:214:in `run_examples'
/Library/Ruby/Gems/1.8/gems/rspec-1.3.0/lib/spec/example/example_group_methods.rb:212:in `each'
/Library/Ruby/Gems/1.8/gems/rspec-1.3.0/lib/spec/example/example_group_methods.rb:212:in `run_examples'
/Library/Ruby/Gems/1.8/gems/rspec-1.3.0/lib/spec/example/example_group_methods.rb:103:in `run'
/Library/Ruby/Gems/1.8/gems/rspec-1.3.0/lib/spec/runner/example_group_runner.rb:23:in `run'
/Library/Ruby/Gems/1.8/gems/rspec-1.3.0/lib/spec/runner/example_group_runner.rb:22:in `each'
/Library/Ruby/Gems/1.8/gems/rspec-1.3.0/lib/spec/runner/example_group_runner.rb:22:in `run'
/Library/Ruby/Gems/1.8/gems/rspec-1.3.0/lib/spec/runner/options.rb:152:in `run_examples'
/Library/Ruby/Gems/1.8/gems/rspec-1.3.0/lib/spec/runner/command_line.rb:9:in `run'
/Library/Ruby/Gems/1.8/gems/rspec-1.3.0/bin/spec:5

ここにはいくつかの問題があります。

1)バックトレースを考えると、共有仕様のコンテキストが何であるかわかりません。 別名、どこに含まれていたか、どのファイルに含まれていたかなど...「ArelJoin#eachは任意の順序で行を反復処理します」という説明がありますが、仕様が多いプロジェクトでは、基本的に自分。

2)失敗の原因となったコンテキストで、その単一の仕様を分離して実行する方法が必要です。 今のところどうすればいいのかわかりません。

最も参考になるコメント

rspec spec/my_spec_that_contains_the_shared_group.rb --example "hello world"介して共有グループで単一の例を実行できます

全てのコメント10件

デビッド、私はこれに対する解決策があるかもしれないと思います:

「it_should_behave_like」(またはエイリアス)が呼び出されると、ExampleGroupに次のメタデータが設定されます。

共有サンプルグループの名前。
「it_should_behave_like」メソッド呼び出しのファイルパスと行番号。

サンプルが失敗すると、RSpecはそのサンプルが共有サンプルグループに存在するかどうかを確認します。 含まれている場合は、ファイルパスと行番号(ExampleGroupメタデータに格納されている)が出力に追加されます。

どう思いますか?

メタデータがすでに存在していることがわかりました:-)

パッチ: http

私たちは今、それが実行されたコンテキストを知っているので、共有グループを呼び出す行を表示@justinkoのパッチ(3906559d059bcdbd4d15303303c517088b038eeb)を、吸収合併しました。 それでも、単一の共有例を実行するという問題は未解決のままですが、これは、少なくとも共有例が失敗したときを理解するのに役立つはずです。

rspec spec/my_spec_that_contains_the_shared_group.rb --example "hello world"介して共有グループで単一の例を実行できます

うん-それは本当だ。 それで十分です。 これを閉じます。 @carllercheこれでは不十分だと思われる場合は、ここにコメントしてください。再開します。

クラップ、これでバグを見つけました:

share_as :MySpecs do
  let(:foo) { described_class # returns nil }

調査中。

share_asを非推奨にします。 モジュールが生成され、 includeを使用して含めることができます。これは、 shared_examples_for行うように、ネストされたグループの作成とは非常に異なる意味を持ちます。 WDYT?

私はそれを廃止することに完全に同意します。 私が最初にRSpecを学び始めたとき、なぜshared_examples_forshare_asがあるのか​​混乱しました。

私はトップレベルのグループにshare_asを使用する傾向があります。

describe Model do
  include MySharedSpecs

  context 'it works' do
    it_should_behave_like 'a working model'

shared_examples_forに切り替えましたが、すべて順調です。 ありがとう。

一番下までスキップする人のために、ジャスティンコが上記のこれに対して完全に満足のいく答えを提供したことを指摘したいと思います。

rspec spec / my_spec_that_contains_the_shared_group.rb --example "hello world"を使用して、共有グループで1つの例を実行できます。

このページは役に立ちましたか?
0 / 5 - 0 評価