在Rails 3中自定义Rspec生成器

时间:2011-11-02 04:40:02

标签: ruby-on-rails ruby-on-rails-3 rspec

我正在编写Rails 3.1引擎并使用RSpec 2进行测试。当我使用rails generate时,我会自动为我生成规范文件,这非常方便:

$ rails g model Foo
  invoke  active_record
  create    db/migrate/20111102042931_create_myengine_foos.rb
  create    app/models/myengine/foo.rb
  invoke    rspec
  create      spec/models/myengine/foo_spec.rb

但是,为了使生成的规范与我的隔离命名空间很好地配合,我必须每次在模块中手动包装规范:

require 'spec_helper'

module MyEngine
  describe Foo do
    it "should be round"
    ...
  end
end

我很想知道是否有一种干净简单的方法来修改自动生成的规范'模板',这样我每次生成新模型或控制器时都不必将规范包装在Module MyEngine

2 个答案:

答案 0 :(得分:6)

您可以使用Rake任务复制RSpec的模板,如:

namespace :spec do
  namespace :templates do
    # desc "Copy all the templates from rspec to the application directory for customization. Already existing local copies will be overwritten"
    task :copy do
      generators_lib = File.join(Gem.loaded_specs["rspec-rails"].full_gem_path, "lib/generators")
      project_templates = "#{Rails.root}/lib/templates"

      default_templates = { "rspec" => %w{controller helper integration mailer model observer scaffold view} }

      default_templates.each do |type, names|
        local_template_type_dir = File.join(project_templates, type)
        FileUtils.mkdir_p local_template_type_dir

        names.each do |name|
          dst_name = File.join(local_template_type_dir, name)
          src_name = File.join(generators_lib, type, name, "templates")
          FileUtils.cp_r src_name, dst_name
        end
      end
    end
  end
end

然后,您可以修改#{Rails.root}/lib/templates/rspec/model/model_spec.rb中的代码以包含模块名称。

答案 1 :(得分:4)

将'/lib/generators/rspec/scaffold/templates/controller_spec.rb'文件从rspec-rails gem复制到'app / lib / templates / rspec / scaffold'文件夹,然后自定义它。显然,如果您转到新版本的rspec-rails,您需要确保自定义模板没有过时。