【问题标题】:How do I use rspec mock methods from inside a custom DSL如何在自定义 DSL 中使用 rspec 模拟方法
【发布时间】:2020-04-02 11:47:19
【问题描述】:

我正在编写一个基于 rspec 的测试库。我有一个看起来像这样的自定义 dsl:

rast Worker do
  prepare do |day_type, dow|
    allow(subject).to receive(:holiday?) { day_type == 'Holiday' }
    allow(subject).to receive(:dow) { dow }
  end

  execute do
    result subject.goto_work?
  end
end

这两个allow 语句不起作用,因为它们在我的自定义DSL rast 中,方法为prepare。我怎样才能让它发挥作用?

execute 方法中,我像这样调用prepare 块:

  def execute
    prepare_block = @prepare_block
    RSpec.describe "test" do
        prepare_block&.call(*params)
    ...

【问题讨论】:

    标签: ruby dsl


    【解决方案1】:

    我不知道全貌,但我猜测一下,你可能会用类似的东西做得更好

    RSpec.describe "test" do
      instance_eval(prepare_block, *params) if prepare_block
    end
    

    instance_eval 将在接收者的上下文中评估块(所以无论selfdescribe 块内)。

    如果您只是执行prepare_block.call,它将无法访问在它恰好被调用的上下文中定义的任何方法,正如您发现的那样。

    祝你好运!

    【讨论】:

    • 感谢您的提示和鼓励,instance_eval 给了我一个想法,您给了我动力。我所做的是实现一个method_missing 然后我将调用存储到一个堆栈中,然后我稍后在RSpec describe 中处理它。不漂亮,但可以完成工作。它还没有完成,但我现在离我的目标更近了。
    猜你喜欢
    • 2013-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多