Capybara + Poltergeist を使ってテストするための環境を Vagrant + Chef で構築

プライベートで開発に関わっている Rails アプリが完成に近づいてきたので、 Capybara と RSpec を使ってインテグレーションテストを書くことにした。

JavaScript で動きをつけたページもきちんとテストしたいので、 JavaScript ドライバに Poltergeist を選択。

以下、作業メモ。

Chef で Phantomjs をインストール

まずは、Poltergeist が依存している、ヘッドレスブラウザの Phantomjs のインストールが必要。

Phantomjs はコミュニティ Cookbook を使ってインストールする。

Berkfile に

cookbook "phantomjs"

の1行を追加し、

berks vendor cookbooks

でインストール。既に cookbooks フォルダが存在する場合は、先に削除しておくこと。

開発環境は Vagrant で構築しているので、Vagrantfile に

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  # ...

  config.vm.provision "chef_solo" do |chef|
    chef.cookbooks_path = ["./chef/cookbooks", "./chef/site-cookbooks"]

    # ...

    # Phantomjs のレシピを追加
    chef.add_recipe "phantomjs::default"
  end
end

を記述して

vagrant provision

を実行。

Capybara と Poltergeist をインストール

ここからは vagrant ssh仮想マシンに入って作業する。

Rails プロジェクトの Gemfile に

group :test do
  # 下記を追加
  gem "capybara"
  gem "database_cleaner"
  gem "poltergeist"
end

を記述。投入したテストデータがちゃんと削除されるように、database_cleaner もあわせて使う。

bundle install

を実行してインストール。

Capybara と Poltergeist と DatabaseCleaner を有効にする

spec_helper.rb に、Capybara と Poltergeist と DatabaseCleaner の設定を記述。

# ...

# Capybara の設定
require 'capybara/rspec'
require 'capybara/rails'
require 'capybara/poltergeist'
Capybara.javascript_driver = :poltergeist

RSpec.configure do |config|
  # ...

  # database_cleaner の設定
  config.before(:suite) do
    DatabaseCleaner.strategy = :transaction
    DatabaseCleaner.clean_with(:truncation)
  end
  config.around(:each) do |example|
    DatabaseCleaner.cleaning do
      example.run
    end
  end
end

これで準備完了

あとは spec/features フォルダ下にフィーチャーを書いて、

bin/rake spec:features

でテストを走らせればいい。

下記のように、js: true オプションを指定した箇所は Poltergeist を使って実行されるようになる。

describe "JavaScript を使ったページのテスト", js: true do
  it "JavaScript が実行されたかのテスト" do
    # テスト内容を書く
  end
end

Pow をアンインストール

だいぶ前に、マルチテナントの Rails アプリをテストするために Pow を導入した。

便利に使っていたけど、もう用済みになったのでアンインストール。

$ curl get.pow.cx/uninstall.sh | sh

Pow は Mac 以外で使えないのがもったいない。 Node ではなく Go で作られていたら Windows でも使えたりしたかもな。

環境や開発者ごとに異なる設定を記述するのに dotenv が便利だった

Rails アプリ開発中、メール送信機能をテストするには GmailSMTP サーバーを使うのが手っ取り早い。

その際、ActionMailer の設定に Gmail のアカウントとパスワードを書く必要があるけど、 開発者ごとに違うし、そもそもアカウントとパスワードをソースコードに直接書きたくない。

そういった環境や開発者ごとに異なる情報を記述するために、 dotenv(dotenv-rails) を導入してみた。

Gemfile に

gem "dotenv-rails", groups: [:development, :test]

を追加して bundle install

プロジェクトのルートディレクトリに .env ファイルを作成し、環境変数にセットしたい情報を記述する。

GMAIL_ADDRESS="your-address@gmail.com"
GMAIL_PASSWORD="your-password"

すると、config/environment/development.rb の ActionMailer の設定が次のように書ける。

config.action_mailer.delivery_method = :smtp
config.action_mailer.raise_delivery_errors = true
config.action_mailer.smtp_settings = {
  enable_starttls_auto: true,
  address: "smtp.gmail.com",
  port: 587,
  domain: "smtp.gmail.com",
  authentication: "plain",
  user_name: ENV["GMAIL_ADDRESS"],
  password: ENV["GMAIL_PASSWORD"]
}

bin/rails server で開発サーバーを起動すれば、.env ファイルに書いた環境変数が自動で読み込まれて ENV にセットされる。

.env ファイルをリポジトリから除外するように .gitignore に追加しておけば、 Gmail のアカウントとパスワードをソースコードに記述せずに、 心置きなくメール送信をテストできる。

RubyMotion をアンインストール

Apple の新言語 Swift を使い始めていて、思いのほか書き心地が良かったので、 iOS アプリ開発は RubyMotion から Swift に移行することにした。

そこで、後戻りできないように、MacBook から RubyMotion をアンインストール。

sudo rm -rf /Library/RubyMotion
sudo rm /usr/bin/motion
rm ~/Library/RubyMotion

書き心地というか、楽しさでは RubyMotion も負けていないんだけど、 ライセンス更新に毎年 10000 円ほどかかるのがツライ。 iOS Developer Program で 7800 円かかるから余計にね。

Rails 開発環境を構築するために Chef を使って PostgreSQL をインストールするメモ

Rails アプリの開発環境を Vagrant + Chef で構築していて、 PostgreSQL のインストールでつまづいたのでメモ。

まず Berkshelf で postgresql のクックブックをダウンロード。

echo cookbook "postgresql" >> Berksfile
berks vendor cookbooks

postgresql クックブックはそのまま使うと、どうしてもエンコーディングUTF-8 を指定してデータベースを作成できなかった。 対策として、postgresql をインポートするクックブックを新規作成する。

knife cookbook create postgresql_server_utf8

デフォルトのレシピを記述。

ENV["LANGUAGE"] = ENV["LANG"] = ENV["LC_ALL"] = "en_US.UTF-8"
include_recipe "postgresql::server"

環境変数をセットしているのがポイント。

あとは Vagrantfile に

VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "hashicorp/precise64"

  config.vm.provision "chef_solo" do |chef|
    chef.cookbooks_path = ["./chef/cookbooks", "./chef/site-cookbooks"]

    chef.add_recipe "postgresql_server_utf8"
    chef.json = {
      "postgresql" => {
        "password" => {
          "postgres" => "postgres"
        },
        "initdb_locale" => "en_US.UTF-8",
        "config" => {
          "lc_messages" => "en_US.UTF-8",
          "lc_monetary" => "en_US.UTF-8",
          "lc_numeric" => "en_US.UTF-8",
          "lc_time" => "en_US.UTF-8"
        }
      }
    }
  end
end

を書いて、vagrant up/provision を実行すれば、 PostgreSQL をインストールできた。 エンコーディングUTF-8 を指定してデータベースを作成できるようにもなった。

博多 一双

久しぶりにラーメン屋を新規開拓したくなったので、博多まで足を伸ばしてみた。 ターゲットは博多駅筑紫口から徒歩6分のところにある『博多 一双』。

f:id:griefworker:20140906182107j:plain

入り口の券売機でラーメン(600円)とミニチャーハン(300円)の食券を購入。 兼虎のときも思ったけど、券売機だいぶ普及してるな。

まずラーメン。

f:id:griefworker:20140906182919j:plain

麺は中細。スープは、豚骨特有の臭みを感じない、クリーミーな豚骨スープ。 一幸舎の系統に近いかも。 ただ、チャーシューの脂身部分が気になった。 トロトロになるまで煮込んである方が好み。

あとミニチャーハン。

f:id:griefworker:20140906182714j:plain

タレでしっかりと味が付いていて、それでいてパラパラで旨い。 ラーメン屋にチャーハンがあったら毎回注文している気がする。 ラーメン屋のチャーハンは中華料理屋のそれよりも好きだな。

関連ランキング:ラーメン | 博多駅東比恵駅

Tiki

福岡市内の人気カレー店としてグルメ本ではおなじみの、 天神南にある『路地裏カレー Tiki』に行ってみた。

f:id:griefworker:20140906115511j:plain

目印の看板。ここから古民家のわきを抜けて裏地に行くと

f:id:griefworker:20140906115452j:plain

こんなところに店が。看板無かったら絶対分からない。 入るまでは本当に Tiki かも疑わしかった。 隠れ家みたいで男心をくすぐられる。

開店直後でまだ席が開いていたので、待たずに座れた。 このあとすぐ席埋まったけど。

早速、スパイシーチキンカレー(800円) を注文。

f:id:griefworker:20140906114252j:plain

一口食べて驚いた。予想よりかなり辛い。 これで中辛とは・・・。 鶏肉はジューシー。カレールーはかなりスパイシーで旨い。 具にはナッツも入っているんだろうか? ときおり感じるカリっとした食感が新鮮で良かった。 額に汗をにじませながら完食。

関連ランキング:インドカレー | 天神南駅西鉄福岡駅(天神)渡辺通駅