.logbook

学んだことを書き綴る、言わば航海日誌です。

Redmineのプラグインをrspecでテストする

f:id:ylgbk:20150214082840j:plain

近づく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関連はいつも環境に惑わされるので、こんなものかなという感じである。