如何在测试中模拟%x?

4

I've got something like this :

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

我知道如何模拟 "system"。但我的问题是关于 "%x"。那么如何模拟 %x?


@theTinMan,什么也没有。在这种情况下,我不会对返回值进行任何操作。 - Emil
3个回答

4

您要找的行是

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

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


2

当你使用%x{xyz}时,它等同于`xyz`,实际上是语法糖,调用了Kernel中的一个名为`(方法名字只有一个反引号字符)的方法,并将字符串参数“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 吗?我只是对这个好奇 :) - Emil
这很有趣 - 我以为%x{xyz}的行为是硬编码的! - Andrew Grimm
4
在Ruby中,你不需要用`来替换%x,它们只是相同的东西的两种不同语法。它们都调用了Kernel#`。 - Scott Olson

0

Scott Olson的评论基础上,鉴于%x 只是 Kernel#`,这对我很有效:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接