【问题标题】:Extending World from inside Before hook in Cucumber to alter helper behavior based on tag从 Cucumber 中的 Before hook 内部扩展 World 以根据标签改变助手行为
【发布时间】:2019-07-15 14:31:01
【问题描述】:

我正在使用 Cucumber 3.1.2 测试我的 Ruby 2.6.x 项目。

现在我想在 World 中包含不同的辅助模块,具体取决于场景的标签,如下所示:

module NormalHelper
  def do_something
    "something"
  end
end

module SpecialHelper
  def do_something
    "something different"
  end
end

Before("~@special") do
  World(NormalHelper)
end

Before("@special") do
  World(SpecialHelper)
end

但是,当我运行 cucumber 时,我被告知

undefined method `World' for #<Cucumber::Rails::World:0x…> (NoMethodError)

Before 挂钩之外,调用World 效果很好。

我做错了什么?

【问题讨论】:

    标签: ruby cucumber bdd


    【解决方案1】:

    首先,在我看来,您正在尝试做的事情是一个非常糟糕的主意。为什么要这样做?

    从技术上讲,在解析 Before 时 World 可能不存在,因此您无法添加它。这只是一个猜测,您可以在尝试添加到 World 之前通过调试和暂停执行来探索这一点。另一种可能性是之前无法从内部范围访问 World,这可以通过使用 ::World 来解决。

    我要记住的另一件事是,世界可能不会为每个场景重新创建。所以你所做的无论如何都不会真正起作用,因为在一个特殊场景和一个正常场景运行之后,两个模块都将在 World 中具有不同定义的重复方法。

    【讨论】:

    • 据我所知 Worldist 的全部要点,每个场景都有一个新的实例,所以场景中的步骤共享一个状态。
    • 你是对的,每个场景都有一个单独的世界。但是,一旦该实例可用,World 就不再可用,因为 self 就是 World。你可以通过扩展 self 来做你想做的事。看看你的钩子里有什么自我。
    猜你喜欢
    • 2020-10-04
    • 1970-01-01
    • 2019-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多