Railsのカスタムgeneratorの、specを記述する

先日はRailsのカスタムgeneratorの作成方法を説明しました (http://d.hatena.ne.jp/kouji0625/20130523/p1) が、今日はそのspecの記述方法を説明します。generator自体の作成はちょろいのですが、generatorのspecとなると面倒そうですね。実際、rspec-railsはgeneratorのspecをサポートしていません。spec/generators/foo_spec.rbを作成しても、「それで何!?」って感じになるだけです。
じゃあ、rspec-railsが提供しているgeneratorには、specがないのかというとそうではありません。ammeter (https://github.com/alexrothenberg/ammeter) というgemを使って次のような感じでspecを記述しています。
https://github.com/rspec/rspec-rails/blob/master/spec/generators/rspec/helper/helper_generator_spec.rb より

require 'spec_helper'

# Generators are not automatically loaded by Rails
require 'generators/rspec/helper/helper_generator'

describe Rspec::Generators::HelperGenerator do
  # Tell the generator where to put its output (what it thinks of as Rails.root)
  destination File.expand_path("../../../../../tmp", __FILE__)

  before { prepare_destination }

  subject { file('spec/helpers/posts_helper_spec.rb') }
  describe 'generated by default' do
    before do
      run_generator %w(posts)
    end

    describe 'the spec' do
      it { should exist }
      it { should contain(/require 'spec_helper'/) }
      it { should contain(/describe PostsHelper/) }
    end
  end
  describe 'skipped with a flag' do
    before do
      run_generator %w(posts --no-helper_specs)
    end
    it { should_not exist }
  end
end

これまたよくできていますね。
APIの詳しい説明はありませんが、以下のような感じでしょうかね。

  • Gemfile
    • group :test { gem 'ammeter' }
  • spec/spec_helper.rb
    • require 'ammeter/init'
  • spec/generators/xxx/xxx_generator_spec.rb
    • require 'generators/xxx/xxx_generator'
    • describe XxxGenerator do
    • destination <生成したファイルの一時保存先>
    • before { prepare_destination }: 決まり文句
    • run_generator <引数>: generatorを実行

これで、generatorもspecの対象の仲間入りです。
なお、テストフレームワークとしてtest-unitを使っている場合は、Rails本体で使っている Rails::Generators::TestCase が使えます。Rails本体のgeneratorのテストコードがとても参考になります。正直なところ、generatorのテストについては、test-unitに乗り換えたくなりましたwww

--- 参考情報(別名:人力合わせて読みたい♪)

--- PR広告
記事を読んでくださり、ありがとうございます。もしよろしければ、この記事の著者が提供している無料のサービス「かくってる?」をお試しください。