コードの再利用のために、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
問題の基本的な回避策を知っていれば、それも素晴らしいでしょう.