4

我有这样的事情:

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 呢?

4

3 回答 3

4

您正在寻找的线路是

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

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

于 2012-10-24T20:21:15.260 回答
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"
于 2012-10-24T17:27:23.090 回答
0

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

  x = Something.new
  expect(x).to receive(:`).with(xyz)
  x.some_method
于 2019-01-23T23:02:03.383 回答