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
--- 参考情報(別名:人力合わせて読みたい♪)
- ammeter: https://github.com/alexrothenberg/ammeter
- rspec-rails / spec / generators / rspec / helper / helper_generator_spec.rb: https://github.com/rspec/rspec-rails/blob/master/spec/generators/rspec/helper/helper_generator_spec.rb
--- PR広告
記事を読んでくださり、ありがとうございます。もしよろしければ、この記事の著者が提供している無料のサービス「かくってる?」をお試しください。
- かくってる?: http://cocktailq.herokuapp.com/