为了代码重用,我正在构建一个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
的问题解决方法,那也很棒。
答案 0 :(得分:1)
@object
时, it_will_navigate_to_object(@object.some_param)
为零,因为它未在与您初始化它的before
块相同的上下文中运行。
粗略地说,RSpec允许您通过为示例组生成一个类(例如您的feature
块)并在上下文中运行传递给before
和it
的块来共享实例变量每个代码示例的该类的新实例。这里出现的问题是对it_will_navigate_to_object(@object.some_param)
的调用是在类的上下文中运行的(所以self
是类,而不是该类的实例)。
可能值得一看共享示例来实现您的目标。见https://www.relishapp.com/rspec/rspec-core/v/2-11/docs/example-groups/shared-examples。特别是“使用块为共享组提供上下文”部分。