【问题标题】:How do I mock %x in a test?如何在测试中模拟 %x?
【发布时间】:2012-10-24 15:40:33
【问题描述】:

我有这样的东西:

class Something
  def some_method
    %x{xyz}
  end
end

在规范中:

describe Something do
  describe "#some_method" do
    it "should execute xyz command in a subshell" do
      x = Something.new
      #What should come here?
      x.some_method
    end
  end
end

我知道如何模拟“系统”。但我的问题是特定于 "%x" 的。那么如何模拟 %x 呢?

【问题讨论】:

  • @theTinMan ,什么都没有。在这种情况下,我没有对返回值做任何事情。

标签: ruby unit-testing rspec mocking tdd


【解决方案1】:

你要找的线是

x.should_receive(:`).once.with('xyz')

反引号实际上是一个被调用的方法,它们之间的任何内容都作为字符串参数传递。 %x{...} 只是反引号的语法变体,因此会导致相同的方法调用。

【讨论】:

    【解决方案2】:

    当您执行%x{xyz} 时,这等效于`xyz`,它被证明是用于在内核上调用名为` 的方法的语法糖(方法名称实际上是单个反引号字符),字符串参数为“xyz ”。

    因为 Ruby 语法不允许您定义此名称的方法,您需要使用 define_method 而不是 def,如下所示:

    module Kernel
      define_method(:"`") do |x|
        x + "blah"
      end
    end
    

    现在`xyz`%x{xyz} 调用这个新方法:

    %x{xyz} #=> "xyzblah"
    `foobar` #=> "foobarblah"
    

    【讨论】:

    • Scott Olson - 感谢您的解释。所以你的建议是用 ` 替换 %x ,并使用 x.should_receive(:`).with('xyz') ,对吗?我试过了。有没有办法模拟 %x ?我只是对这个很好奇:)
    • 这很有趣 - 我认为 %x{xyz} 的行为是天生的!
    • 你不需要用`替换%x,只是它们是Ruby中完全相同事物的两种不同语法。 (它们都调用 Kernel#`)
    【解决方案3】:

    基于Scott Olson 的评论,因为%x 只是Kernel#`,这对我有用:

      x = Something.new
      expect(x).to receive(:`).with(xyz)
      x.some_method
    

    【讨论】:

      猜你喜欢
      • 2020-07-17
      • 2023-03-20
      • 2017-05-16
      • 1970-01-01
      • 2017-06-14
      • 1970-01-01
      • 2017-04-19
      • 2020-01-05
      • 1970-01-01
      相关资源
      最近更新 更多