将实例变量传递到外部scriptlet

时间:2013-11-15 08:37:06

标签: ruby rspec capybara integration-testing factory-bot

为了代码重用,我正在构建一个rspec scriptlet的外部库(在这里定义为包装它的方法)(如下所示:)

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

如果删除导航scriptlet,一切运行正常,但是如果它已经设置,则会产生以下错误消息:

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

这似乎表明describe块的主体在before条件之前被解析了?到底是怎么回事?我该如何解决这个问题?

编辑:

正如Steve在下面所建议的那样,我试图通过shared_examples重新连接所有内容。

这导致规范作为功能/请求级别规范执行,每个示例之间刷新测试的网页,而不是我正在拍摄的集成级别规范。

代码看起来与上面的示例相同,只是每个def都替换为shared_example,“方法”(示例)名称被字符串化,后跟do,然后适当地打电话。

如果有人知道基于shared_examples的问题解决方法,那也很棒。

1 个答案:

答案 0 :(得分:1)

当您致电@object时,

it_will_navigate_to_object(@object.some_param)为零,因为它未在与您初始化它的before块相同的上下文中运行。

粗略地说,RSpec允许您通过为示例组生成一个类(例如您的feature块)并在上下文中运行传递给beforeit的块来共享实例变量每个代码示例的该类的新实例。这里出现的问题是对it_will_navigate_to_object(@object.some_param)的调用是在类的上下文中运行的(所以self是类,而不是该类的实例)。

可能值得一看共享示例来实现您的目标。见https://www.relishapp.com/rspec/rspec-core/v/2-11/docs/example-groups/shared-examples。特别是“使用块为共享组提供上下文”部分。