読者です 読者をやめる 読者になる 読者になる

Folioscope

プログラミング/Unix系/デザイン/CG などのメモがもりもり

RailsプラグインのテストのためのテストRailsプロジェクト

Railsプラグインを開発するときには、テスト用のRailsプロジェクトが必要になりますね。 そこでテスト用のRailsプロジェクトをプロジェクトのサブディレクト以下に作成して、specからRailsアプリをテストできるようにします。

ディレクトリ構成は以下のとおりです。

/    # project root
├── Gemfile
├── lib    # プロジェクトの本体
└── spec
    ├── rails_app/    # Railsアプリのディレクトリをspec以下に
    ├── spec_helper.rb
    └── rails_app_spec.rb

Railsアプリの場所はどこでもいいですけど、テスト時に使うのでspec以下が妥当だと思います。

bundle install

まずGemfileを書きます。rails環境も開発・テスト環境でしか使わないので、:development, :test グループに放り込みます。

# Gemfile
source "https://rubygems.org"

group :development, :test do
  gem 'rspec'
  gem 'rails', '4.2.4'
  gem "sqlite3"
end

その後は通常通り bundle install します。

Railsアプリの作成

ここまででrailsコマンドが使えるので、spec以下にRailsアプリをnewします。 Gemfileやbundleも必要無いので、オフにします。

bundle exec rails new --skip-bundle --skip-gemfile spec/rails_app

これでサブディレクトリにRailsアプリができました。 rails consoleやdb:migrateするときも、rails_appに移動してから通常のRailsプロジェクトと同じように実行できます。 以上でRailsアプリ側の準備は完了です。

RSpecの設定

つづいてspecを書いてゆきます。まず spec_helper.rb に、先ほど作ったRailsの環境をロードするために、次の2行を書きます。

# spec/spec_helper.rb
ENV['RAILS_ENV'] ||= 'test'
require File.expand_path('../rails_app/config/environment', __FILE__)

これでspec_helperをrequireしたテストは、RSpec時にRails環境がロードされます。 確認のためにRailsを使用した簡単なspecを書きます。

# spec/rails_app_spec.rb
require 'spec_helper'

RSpec.describe 'Rails app project' do
  describe 'Rails environment setup' do
    subject { Rails.root.to_s }
    it { should match %r(spec/rails_app) }
  end
end

そして通常通りRSpecを走らせて、テストがパスするか確認します。

bundle exec rspec

補足 : Rakeタスクのロード

Rakefile内でテスト用RailsアプリのRakefileをロードすることで、Railsアプリ用Rakeタスクも実行できます。

# Rakefile 
namespace 'rails_app' do
  load File.expand_path('../spec/rails_app/Rakefile', __FILE__)
end
bundle exec rake rails_app:db:migrate  # DBマイグレート