Redmineのプラグインをrspecでテストする
近づくRedmine3.0と、混沌としたソースコード
筆者は個人的に作成したRedmineのプラグインをgithubで公開している。Redmine上でニコニコカレンダーを実現するプラグインである。
実はこのプラグイン、勢いで作ったこともあってテストコードが無い。コード量がそこまで多くないのでこれまではそれでなんとかなっていた。
しかし、もうすぐRedmine3.0がリリースされる。これまでのコードが動作しなくなることに伴ってコード修正が発生するだろう。この時テストコードがあると、修正への抵抗感も断然小さい。
修正前にテストコードを書き、対象を壊さないように修正する。これを実現するためにテスト環境を今のうちに作っておく。
Rspecを使う
Rubyまたはruby on railsのテストといえば「Rspec」だ。昨年はruby on railsでのテスト方法を詳細に解説した電子書籍も発売された。
Read Everyday Rails - RSpecによるRailsテスト入門 | Leanpub
この本は良書である。初めてテストコードを書く人にとってバイブルになるだろう。railsのバージョンアップに追従して、本も改訂されておりそれが無料でダウンロードできるのでありがたい。
環境を作る
インストール
Rspecを含め、必要なツールをインストールするためにGemfile
を修正する。既にRedmine2.xがインストールされていることを前提とする。
group :test do gem "shoulda", "~> 3.3.2" gem "mocha", ">= 0.14", :require => 'mocha/api' if RUBY_VERSION >= '1.9.3' gem "capybara", "~> 2.1.0" gem "selenium-webdriver" gem "rspec-rails", "~> 3.1.0" gem "factory_girl_rails", "~> 4.4.1" gem "guard-rspec", "~> 4.3.1" gem "spring-commands-rspec", "~> 1.0.2" end end
修正が終わったら、インストールする。
$ bundle install
データベースを作成
次にテスト用のデータベースを作成します。まず編集するのはconfig/database.yml
である。
test: adapter: mysql2 database: redmine_test host: localhost username: (mysqlのユーザ名) password: (mysqlのパスワード) encoding: utf8
できたらdb:create
してマイグレーションする。
$ bundle exec rake db:create $ bundle exec rake generate_secret_token $ bundle exec rake db:migrate RAILS_ENV=test
初期化
通常Rspecを使う際は、アプリケーションのルートディレクトリで以下のコマンドを実行し、.rspecファイルやヘルパーを自動生成する。
$ bundle exec rails generate rspec:install
テストコード作成
しかし、Redmineのプラグインはplugin/(プラグイン名)
の配下に生成される。この場所にはspecフォルダが生成されないため、自分で作成する。動作確認用にテストコードも作っておく。
$ mkdir -p plugin/(プラグイン名)/spec/models $ vi plugin/(プラグイン名)/spec/models/niko_face_.rb // モデルのテストコード
テストコードは以下のようにする。
require 'rails_helper' describe NikoFace do # テスト it "is test" end
実行
準備ができたのでいよいよテストを実行する。Redmineのルートディレクトリにて以下のコマンドを実行する。
$ bundle exec rails s -e test $ bundle exec rspec plugins/(プラグイン名)/spec
しかしエラーとなった。
/home/user/.rbenv/versions/1.9.3-p484/lib/ruby/gems/1.9.1/gems/rspec-support-3.1.2/lib/rspec/support/version_checker.rb:28:in `raise_too_low_error': You are using capybara 2.1.0. RSpec requires version >= 2.2.0. (RSpec::Support::LibraryVersionTooLowError) from /home/user/.rbenv/versions/1.9.3-p484/lib/ruby/gems/1.9.1/gems/rspec-support-3.1.2/lib/rspec/support/version_checker.rb:18:in `check_version!'
capybaraのバージョンが古いとのこと。Gemfileを修正し、バージョンを上げる。これで実行できるはずだ。
gem "capybara", "~> 2.2.0"
$ bundle install $ bundle exec rspec plugins/(プラグイン名)/spec * Pending: NikoFace is test # Not yet implemented # ./plugins/redmine_nikoca_re/spec/models/niko_face_spec.rb:5 Finished in 0.00695 seconds (files took 6.72 seconds to load) 1 example, 0 failures, 1 pending
ようやくテストが実行された...
かなり時間がかかってしまったが、Redmine関連はいつも環境に惑わされるので、こんなものかなという感じである。