【问题标题】:passing instance variables into external scriptlets将实例变量传递到外部脚本
【发布时间】:2013-11-15 08:37:06
【问题描述】:

为了代码重用,我正在构建一个 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

如果navigation scriptlet 被删除,一切运行正常,但是如果它被安装,则会产生以下错误消息:

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

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

编辑:

正如下面史蒂夫所建议的,我试图通过 shared_examples 重新连接所有内容。

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

代码看起来与上面的示例相同,除了每个def 都被替换为shared_example,并且“方法”(示例)名称被字符串化并后跟do,然后被适当地调用。

如果有人知道基于shared_examples 的解决方法,那就太好了。

【问题讨论】:

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


    【解决方案1】:

    当您调用 it_will_navigate_to_object(@object.some_param) 时,@object 为 nil,因为它与您初始化它的 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。特别是“使用块为共享组提供上下文”部分。

    【讨论】:

    • 谢谢你,这很酷!还有一个问题,我将如何使用这种方法做类似的事情: def it_will_click(button) self.send(:"it_will_click_#{button.downcase}") end private def it_will_click_done it "clicks Done" do click_on "Done " end end def it_will_click_cancel it "clicks Cancel" do click_on "Cancel" end end
    猜你喜欢
    • 2023-03-11
    • 1970-01-01
    • 2022-06-23
    • 1970-01-01
    • 2015-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-30
    相关资源
    最近更新 更多