我有这样的事情:
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?
答案 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