0

为了代码重用,我正在构建一个 rspec scriptlets 的外部库(在这里定义为包装 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 重新连接所有内容。

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

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

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

4

1 回答 1

1

@object调用时为 nil,因为它没有在与初始化它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。特别是“使用块为共享组提供上下文”部分。

于 2013-11-15T09:03:28.677 回答