RSpec:如何在实例化之前在对象上存根方法,而不必将所有其余方法存根?

时间:2015-04-28 00:27:59

标签: rspec gem mocking

我正在为Rails编写一个gem,其中包含一个用于创建模型的生成器。在某些情况下,生成器应该调用自身,并使用generate方法执行此操作。这在实际使用时工作正常。

我正在使用带有generator_spec的RSpec 3.2来尝试测试此功能,但作为一个gem,当它进入generate调用时,它会抱怨Rails不存在:< / p>

/path/to/ruby: No such file or directory -- bin/rails (LoadError)

所以我一直试图将Generator#generate方法存根,使其与规范中的run_generator做同样的事情,紧接在调用run_generator的{​​{1}}来电之前在他们中间。 但是,对于我所有可能的解决方案,我遇到了问题。

直接覆盖班级 - 不能使用规范方法。

generate

这会引发class Generator def generate(*args) run_generator args[1..-1] end end 。不足为奇。

使用部分双重实例化为时已晚。

undefined method 'run_generator'

这是完美的,但allow(generator).to receive(:generate) { |*args| run_generator args[1..-1] } 在幕后调用方法,因此相关的run_generator尚不存在。

使用实例double - 不允许使用其他方法。

generator

但是,使用double需要你将所有的方法存在于将要使用的方法上 - 其余的只是调用它们的原始实现。这似乎很难也没必要。有没有办法绕过它?

1 个答案:

答案 0 :(得分:0)

Taryn East最终给了我vital clue:我需要在我的测试目录中使用完整的Rails应用程序。

不幸的是,generator_spec的{​​{1}}方法完全打击了目标目录,所以我最终得到的结果是:

prepare_destination