我有Ruby代码,它在一些地方使用反引号并想测试它。我正在使用FlexMock,并且想要以某种方式嘲笑该方法。我知道该方法是Kernel, :`,但似乎无法使其与FlexMock一起使用。你会如何做到这一点?这里有一个方法的示例中,我想测试:Ruby - FlexMock反向代码方法
def foo
result = `ls`
if result.to_a.length > 0
true
else
false
end
end
我有Ruby代码,它在一些地方使用反引号并想测试它。我正在使用FlexMock,并且想要以某种方式嘲笑该方法。我知道该方法是Kernel, :`,但似乎无法使其与FlexMock一起使用。你会如何做到这一点?这里有一个方法的示例中,我想测试:Ruby - FlexMock反向代码方法
def foo
result = `ls`
if result.to_a.length > 0
true
else
false
end
end
所以事实证明,反引用方法专门映射到Kernel.`,这是很好的,直到看到FlexMock源代码来查看他们认为是有效的方法名称。他们使用的正则表达式主要是检查字母数字与?要么 !最后,反引号无法匹配这个正则表达式。
在内部更改代码可解决引发的初始异常,但实际上并未使代码按预期工作。我可以像pierr建议的那样对它进行monkeypatched,但是这在我的测试代码中是非常重复的,所以我选择了替代路线,并在我的库代码中只使用了反引号。然后这个方法可以以所需的方式被模拟出来,并且由于我只在少数地方使用反引号,所以我的底层代码不得不被改变。
我一无所知flexmock,但你可能想看看this。
你应该叫
Kernel.` "cmd"
,而不是在你的代码中使用
`cmd`
。然后,你可以测试这样的:
it "should call system ls" do
Kernel.should_receive(:`).with("ls")
Kernel.` "ls"
end
这个例子使用纯rspec的
是的,正如我的回答所说,flexmock不允许反引号处于模拟方法名称中,所以虽然它可能适用于rspec,但它不适用于flexmock。虽然谢谢! – 2009-11-15 03:08:27
嗯,我可以用一些类似的,但它使很多是flexmock被设计来解决工作。部分问题是''方法的命名方式与标准方法不同,所以flexmock的内部正则表达式并不认为它是一种真正的方法,但是对于这个好主意来说是+1。谢谢! – 2009-10-29 02:25:19