单元测试调用另一个生成器的Rails生成器

时间:2013-10-31 04:39:10

标签: ruby-on-rails ruby unit-testing ruby-on-rails-4

我有一个我想制作的rails生成器,除其他外,它将运行一些基于yaml文件的脚手架:

class MyGenerator < Rails::Generators::Base
    ...
    def run_scaffolds
        ...
        invoke 'scaffold', fields
        ...
    end
end

我按照here所述调用脚手架生成器。

问题是如果我尝试在单元测试中运行它:

class ScaffoldTest < Rails::Generators::TestCase
    tests MyGenerator
    destination File.expand_path("../tmp", File.dirname(__FILE__))
    setup :prepare_destination

    test "run scaffolds" do
        run_generator ["example_file.yaml"]
        # doesn't get to here
    end
end

我最终得到了一个错误:

Errno::ENOENT: No such file or directory - .../tmp/config/routes.rb

这是因为tmp目录中没有Rails应用程序。我的问题是,如果没有rails应用程序无法执行,我怎么可能测试这个生成器?当我运行测试时,我不应该在tmp文件夹中创建一个新的rails应用程序吗?

1 个答案:

答案 0 :(得分:1)

我决定使用mocha来停止对生成器的调用:

Rails::Generator.stubs(:invoke)
run_generator ["example_file.yaml"]

我选择了这个解决方案,因为它让我验证代码是否使用正确的参数调用生成器,并且它不需要我在真正的rails应用程序中实际运行生成器。