Ruby-FlexMock Backticks方法

Ruby-FlexMock Backticks方法,ruby,Ruby,我有一个Ruby代码,它在很多地方使用了backticks,我想对它进行测试。我正在使用并想以某种方式嘲笑这种方法。我知道该方法很简单,但似乎无法将其与FlexMock一起使用。你会怎么做?下面是我想测试的一个方法示例: def foo result = `ls` if result.to_a.length > 0 true else false end end 我对FrimoCK一无所知,但你可能想看看.,所以它证明了ButTKES方法是专门映射到内核的

我有一个Ruby代码,它在很多地方使用了backticks,我想对它进行测试。我正在使用并想以某种方式嘲笑这种方法。我知道该方法很简单,但似乎无法将其与FlexMock一起使用。你会怎么做?下面是我想测试的一个方法示例:

def foo
  result = `ls`
  if result.to_a.length > 0
    true
  else
    false
  end
end

我对FrimoCK一无所知,但你可能想看看.

,所以它证明了ButTKES方法是专门映射到内核的.',这很好,直到你查看FLUMMOCK源,看看他们认为什么是有效的方法名称。他们使用的正则表达式本质上是用什么来检查字母数字?或最后,backtick与这个正则表达式不匹配

在内部更改代码可以解决引发的初始异常,但实际上不会使代码按预期工作。我可以按照pierr的建议对其进行MonkeyPatch,但这在我的测试代码中是非常重复的,所以我选择了另一种方法,在我的库代码中创建了一个shell方法,它只做反勾号。然后,可以按照所需的方式模拟此方法,并且由于我只在少数地方使用反勾号,因此不需要对我的许多底层代码进行更改。

您应该调用

Kernel.` "cmd" 
而不是使用

  `cmd` 
在你的代码上。然后您可以像这样进行测试:

it "should call system ls" do
  Kernel.should_receive(:`).with("ls")
  Kernel.` "ls"
end

这个例子使用纯rspec

Hmm,我可以使用类似的东西,但是它做了很多flexmock设计用来解决的工作。部分问题在于`方法的命名与标准方法不同,因此flexmock的内部正则表达式并不认为它是一个真正的方法,但最好是+1。谢谢是的,正如我的回答所说,flexmock不允许反勾号出现在模拟的方法名称中,所以虽然它可能适用于rspec,但它不适用于flexmock。谢谢你!