0

コードの再利用のために、rspec スクリプトレットの外部ライブラリを構築しています (ここでは it ブロックをラップするメソッドとして定義されています) (そのように:)

module MyTestSuite
  module Scriptlets
    module Navigation

       def it_will_demo_concept_of_scriptlets
         it "will demo concepts of scriptlets" do
               ...
         end
       end

       def it_will_navigate_to_object(object)
         it "will navigate to object" do
                .... 
                ....actions and expectations go here
                ....
                ....
         end
       end
    end
   end
end

これは次のようにインポートされます。

include MyTestSuite::Scriptlets::Navigation

feature "my tests" do

    before(:each) do
       @object = create(:my_object)
    end

    describe "my tests" do
       it_will_demo_concept_of_scriptlets
       it_will_navigate_to_object(@object.some_param)
    end
end

ナビゲート スクリプトレットを削除すると、すべて正常に動作しますが、インストールすると、次のエラー メッセージが生成されます。

undefined method 'some_param' for nil:NilClass (NoMethodError)

これは、describe ブロックの本体が before 条件の前に解析されることを示唆しているようです。何が起こっている?これを回避するにはどうすればよいですか?

編集:

以下のスティーブが提案したように、shared_examples を介してすべてを再配線しようとしました。

これにより、私が目指している統合レベルの仕様ではなく、テスト対象の Web ページがすべてのサンプル間で更新される、機能/要求レベルの仕様として仕様が実行されるようになりました。

コードは上記のサンプルと同じように見えますが、すべてdefが に置き換えられshared_example、「メソッド」(例) 名が文字列化されdo、その後に が続き、適切に呼び出されます。

誰かがshared_examples問題の基本的な回避策を知っていれば、それも素晴らしいでしょう.

4

1 に答える 1

1

@object初期化したブロックit_will_navigate_to_object(@object.some_param)と同じコンテキストで実行されていないため、呼び出すときは nil です。before

大雑把に言えば、RSpec を使用すると、サンプル グループ (featureブロックなど) のクラスを生成し、渡されたブロックを各コード サンプルのそのクラスの新しいインスタンスのコンテキストで実行するbeforeことitにより、インスタンス変数を共有できます。ここで間違っているのは、への呼び出しit_will_navigate_to_object(@object.some_param)がクラスのコンテキストで実行されることです (そのselfクラスのインスタンスではなく、クラスも同様です)。

あなたがやろうとしていることを達成するために、共有された例を見てみる価値があるかもしれません. https://www.relishapp.com/rspec/rspec-core/v/2-11/docs/example-groups/shared-examplesを参照してください。特に、「ブロックを使用して共有グループにコンテキストを提供する」セクション。

于 2013-11-15T09:03:28.677 に答える