Ruby 将实例变量传递到外部scriptlet

Ruby 将实例变量传递到外部scriptlet,ruby,rspec,capybara,integration-testing,factory-bot,Ruby,Rspec,Capybara,Integration Testing,Factory Bot,为了实现代码重用,我正在构建一个rspec scriptlet的外部库(这里定义为一个包装it块的方法)(如下所示:) 然后像这样导入: include MyTestSuite::Scriptlets::Navigation feature "my tests" do before(:each) do @object = create(:my_object) end describe "my tests" do it_will_demo_

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

然后像这样导入:

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
如果删除navigate scriptlet,则一切正常运行,但如果它已安装,则会生成以下错误消息:

为nil:NilClass(NoMethodError)未定义的方法'some_param'

这似乎表明descripe块的主体是在before条件之前解析的?发生了什么事?我如何解决这个问题

编辑:

正如Steve在下面所建议的,我试图通过分享的例子来重新构建一切

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

代码看起来与上面的示例完全相同,只是每个
def
都被替换为
共享的_示例
,“方法”(示例)名称被字符串化,后跟
do
,然后被适当地调用


如果有人知道该问题的基于
共享\u示例的解决方法,那也太好了。

@object
在调用
时为零,它将导航到\u对象(@object.some \u param)
,因为它与初始化它的
块之前的
在同一上下文中运行

粗略地说,RSpec允许您通过为示例组(例如,您的
功能
块)生成一个类,并在每个代码示例的该类新实例的上下文中运行传递到
之前的
it
中的块,来共享实例变量。这里的问题是对
it\u的调用将导航到\u对象(@object.some参数)
是在类的上下文中运行的(因此
self
是类而不是该类的实例)


也许值得看一看共享的示例,以实现您想要做的事情。看见特别是关于“使用块为共享组提供上下文”的部分。

谢谢,这很酷!还有一个问题,我如何使用这种方法来做类似的事情:def it_will_click(button)self.send(:“it_will_click{button.downcase}”)end private def it_will_click_done“clicks done”do click_on“done”end def it_will_click{button.downcase})end private def it_will_click_取消它“单击取消”是否单击“取消”结束
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