Ruby - FlexMock反引号方法

时间:2009-10-28 03:02:40

标签: ruby

我有Ruby代码,它在许多地方使用反引号并想要测试它。我正在使用FlexMock并想以某种方式模拟该方法。我知道该方法是Kernel, :`但似乎无法使其与FlexMock一起使用。你会怎么做?以下是我想测试的方法示例:

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

3 个答案:

答案 0 :(得分:3)

所以事实证明反引号方法专门映射到Kernel。,这很好,直到看到FlexMock源来查看它们认为是有效的方法名称。他们使用的正则表达式主要是检查字母数字?要么 !最后,所以反引用无法匹配这个正则表达式。

在内部更改代码可以解决抛出的初始异常,但实际上并不能使代码按预期工作。我可以像pierr建议的那样对它进行monkeypatched,但是在我的测试代码中这将是非常重复的,所以我选择了替代路由,并在我的库代码中创建了一个shell方法,只进行反引号。然后可以以所需的方式模拟这种方法,因为我只在少数地方使用反引号,而不是必须更改我的许多底层代码。

答案 1 :(得分:1)

我对flexmock一无所知,但你可能想看看this

答案 2 :(得分:0)

你应该致电

Kernel.` "cmd" 

而不是使用

  `cmd` 

代码。然后你可以这样测试:

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

此示例使用纯rspec