モリジュン(@zyunnosuke)氏が、RailsでオリジナルRakeタスク作成からRSpecテストまでの記事において、Rakeタスクの作り方、RSpecによるテストの仕方を解説してます。その記事では、RSpecは2.x系で、テストコードで、shouldを使っています。今回、RSpec 3.0.xで、expectを使いたいので、挑戦してみました。
1. プロジェクトの作成
$ rails new rake-test-sample $ cd rake-test-sample $ bundle update $ bundle install
2. モデルの作成
rakeのタスクの内容をクラスに抽出したものとして、モデル ReportGeneratorを作成する。
$ rails generate model report_generator $ bundle exec db:migrate
モデルクラス ReportGeneratorには、次の内容を記述。
class ReportGenerator < ActiveRecord::Base def self.generate puts "ReportGenerator.generate called." end end [/ruby] クラスメソッドで、ダミーな処理を記述している。 3. Rakeタスクファイルの作成 [bash] $ rails generate task reports [/bash] 生成されたlib/tasks/repots.rakeに次の内容を記述。元記事のまんまです。 [ruby] namespace :reports do # descの記述は必須 desc "Generate report" # :environmentはモデルにアクセスするのに必須 task :generate => :environment do # 処理を記述 ReportGenerator.generate end end
タスクの確認は
$ rake -vT |grep reports rake reports:generate # Generate report
タスクの実行は
$ rake reports:generate
4. Gemfileにrspecとrspec-its の追加
元記事では、specファイルで、itsを使っていますが、itsはrspec 3.0.xではサポートされなくなりました。RSpec の入門とその一歩先へ、第3イテレーション ~RSpec 3バージョン~によると、gem rspec-itsを導入すると、itsが使えるとのことです。そこで、元記事に書かれていたrake_shared_context のgemと共に、Gemfileに以下を追加。
group :development, :test do gem 'rake_shared_context' gem 'rspec-rails', '3.0.0' gem 'rspec-its', '1.0.1' end
$ bundle update $ bundle install
を実行。
5. RakeタスクのRSpecの作成
rspecによるテストが出来るように次のコマンドを実行します。
$ bundle exec rails generate rspec:install
元記事では、spec/lib/tasks/reports_rake_spec.rbファイルは、次の内容でした。
require 'spec_helper' describe 'reports:generate' do include_context 'rake' its(:prerequisites) { should include('environment') } it 'generates the report' do ReportGenerator.should_receive(:generate) subject.invoke end end
これは、rspec 2.x向けの記述なので、次のように書き換えます。
require 'spec_helper' describe 'reports:generate' do include_context 'rake' its(:prerequisites) { is_expected.to include('environment') } it 'generate the report' do expect(ReportGenerator).to receive(:generate) subject.invoke end end
記述の仕方は、RSpec の入門とその一歩先へ、第3イテレーション ~RSpec 3バージョン~ や、RSpec 3の重要な変更を参考にしました。
6. Rakeテストの実行
$ bundle exec rspec spec/lib/tasks/reports_rake_spec.rb
warningが多いので、プロジェクトディレクトリの .rspecファイルで、–warningsの行を削除しておきます。
`find_and_eval_shared’: Could not find shared context “rake” (ArgumentError)
というエラーが出ますが、spec/spec_helper.rbの冒頭に次の記述をします。
# This file is copied to spec/ when you run 'rails generate rspec:install' ENV["RAILS_ENV"] ||= 'test' require File.expand_path("../../config/environment", __FILE__) require 'rspec/rails' require 'rspec/autorun'
この記述は、パーフェクトRuby on Railsを参考にしました。
再度、テストを実行。
$ bundle exec rspec spec/lib/tasks/reports_rake_spec.rb ... Finished in 0.01324 seconds (files took 1.22 seconds to load) 2 examples, 0 failures
テストが通りました。
7. ソースの公開場所
8. Special Thanks