如何在测试中模拟%x?

时间:2012-10-24 15:40:33

标签: ruby unit-testing rspec mocking tdd

我有这样的事情:

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?

3 个答案:

答案 0 :(得分:3)

您要寻找的是

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

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

答案 1 :(得分: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"

答案 2 :(得分:0)

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

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