2009-10-28 29 views
3

我有Ruby代码,它在一些地方使用反引号并想测试它。我正在使用FlexMock,并且想要以某种方式嘲笑该方法。我知道该方法是Kernel, :`,但似乎无法使其与FlexMock一起使用。你会如何做到这一点?这里有一个方法的示例中,我想测试:Ruby - FlexMock反向代码方法

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

回答

3

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

在内部更改代码可解决引发的初始异常,但实际上并未使代码按预期工作。我可以像pierr建议的那样对它进行monkeypatched,但是这在我的测试代码中是非常重复的,所以我选择了替代路线,并在我的库代码中只使用了反引号。然后这个方法可以以所需的方式被模拟出来,并且由于我只在少数地方使用反引号,所以我的底层代码不得不被改变。

1

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

+0

嗯,我可以用一些类似的,但它使很多是flexmock被设计来解决工作。部分问题是''方法的命名方式与标准方法不同,所以flexmock的内部正则表达式并不认为它是一种真正的方法,但是对于这个好主意来说是+1。谢谢! – 2009-10-29 02:25:19

0

你应该叫

Kernel.` "cmd" 

,而不是在你的代码中使用

`cmd` 

。然后,你可以测试这样的:

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

这个例子使用纯rspec的

+1

是的,正如我的回答所说,flexmock不允许反引号处于模拟方法名称中,所以虽然它可能适用于rspec,但它不适用于flexmock。虽然谢谢! – 2009-11-15 03:08:27