Ruby 将实例变量传递到外部scriptlet
为了实现代码重用,我正在构建一个rspec scriptlet的外部库(这里定义为一个包装it块的方法)(如下所示:) 然后像这样导入: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_
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