Ruby - FlexMock 反引号方法

3
我有一些使用反引号的Ruby代码,想要对其进行测试。我正在使用FlexMock,并希望以某种方式模拟该方法。我知道该方法是Kernel, :`,但似乎无法在FlexMock中使其正常工作。你会如何处理这个问题?以下是我想要测试的一个示例方法:
def foo
  result = `ls`
  if result.to_a.length > 0
    true
  else
    false
  end
end
3个回答

3
因此,事实证明反引号方法特别映射到Kernel。`,这很好,直到有人查看FlexMock源代码以查看他们认为什么是有效的方法名称时。他们使用的正则表达式基本上是检查带有?或!结尾的字母数字字符,因此反引号无法匹配此正则表达式。
更改内部代码解决了最初抛出的异常,但实际上并没有使代码按预期工作。我可以按照pierr的建议进行monkeypatching,但在我的测试代码中这将非常重复,因此我选择了另一条路线,并在我的库代码中只创建了一个执行反引号的shell方法。然后可以以所需的方式模拟此方法,由于我仅在少量位置使用反引号,因此不必更改许多底层代码。

1

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


嗯,我可以使用类似的东西,但它会产生很多工作,而 flexmock 的设计就是为了避免这种情况。问题的一部分在于 method 的命名与标准方法不同,因此 flexmock 的内部正则表达式认为它不是真正的方法,但是对于这个好主意还是要点赞。谢谢! - Chris Bunch

0

你应该调用

Kernel.` "cmd" 

不要使用

  `cmd` 

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

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

这个例子使用纯 RSpec


1
是的,正如我的回答所说,flexmock 不允许反引号出现在模拟方法名称中,因此虽然它可能适用于 rspec,但对于 flexmock 来说却不起作用。谢谢! - Chris Bunch

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