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

オモンパカリスト

深層学習、計算論的神経科学に興味あります

Rails開発でそろそろテストやんないとな、RSpec + FactoryGirlに落ち着いたよって話

近況

少し開発から離れていた。
とある企業の書類選考で「Twitterっぽい掲示板」が課題としてあった。
要件定義を満たせていればどの言語を用いても良いとのことなので

三日くらいで作った。GitHubにあからさまに居てます
kazukousen

テストは書いてません

Heroku

久々に触った。CLIめちゃくちゃかっこよくなってた。
結構つまづいた。 何でつまづいたか忘れた。
環境変数gem 'dotenv_rails'で管理するのが主流だったけど
heroku環境に直接書く

$ heroku config:set TWITTER_API_KEY=XXXXXXXXXXXXXXXXX

UnicornをHerokuで走らせる

WEBRickではなくUnicornで行きましょう!
とはいってもUnicornのワーカーは2個までくらいにしないと
Herokuの最大メモリ500MBあっという間に超えてしまう

config/unicorn_production.rb

worker_processes Integer(ENV["WEB_CONCURRENCY"] || 2)
timeout 15
preload_app true

before_fork do |server, worker|
  Signal.trap 'TERM' do
    puts 'Unicorn master intercepting TERM and sending myself QUIT instead'
    Process.kill 'QUIT', Process.pid
  end

  defined?(ActiveRecord::Base) and
    ActiveRecord::Base.connection.disconnect!
end


after_fork do |server, worker|
  Signal.trap 'TERM' do
    puts 'Unicorn worker intercepting TERM and doing nothing. Wait for master to send QUIT'
  end

  defined?(ActiveRecord::Base) and
    ActiveRecord::Base.establish_connection
end

worker_processes Integer(ENV["WEB_CONCURRENCY"] || 2)がミソ

HerokuはProcfileに基づいてアプリを起動するので
Procfile

web: bundle exec unicorn -p $PORT -c ./config/unicorn_production.rb

これをアプリのルートディレクトリにブッコム。

$ heroku run ps:restart

さて本題

テストを始めよう

今開発している勉強会促進サイトComicomu
Github: kazukousen/comicomu

テストを書いてません

ノーテストでEC2インスタンス無料枠にデプロイしております。
Capistranoで詰まって諦めて、の状態。

テスト書くか。。

MiniTest?RSpec?

Rails Tutorial様は第三版からMiniTestだけど
まだまだRSpecデファクトスタンダードの世の中らしい。
FixtureはFactoryGirlの組み合わせが鉄板の模様。

でもMiniTest(標準)で入っている。そんな状態。

RailsRSpec + FactoryGirl

導入

Gemfileに追加

group :test do
  gem 'rspec-rails'
  gem 'factory_girl_rails'
end


# springを入れている場合、対応させることができる
group :development do
  gem 'spring'
  gem 'spring-commands-rspec'
end

すでにMiniTestを入れている場合

test/ディレクトリ丸ごと削除

$ bundle install

設定

config/application.rb

config.generators do |g|
  g.test_framework :rspec, view_specs: false, fixture: true
  g.fixture_replacement :factory_girl, dir: 'spec/factories'
end

インストール

$ rails g rspec:install

  • .rspec
  • spec/spec_helper.rb
  • spec/rails_helper.rb

Springに対応

$ bundle exec spring binstub rspec

  • bin/rspec

既にbin/rspecがある場合は一度削除する

つぎは

gem 'shoulda-matchers'とGuard自動化を書く体力あったら書きます