もふもふ技術部

Sinatra + RSpec + FactoryGirlのスケルトンがやっと出来た


ハッカソンとか行くと限られた時間内でアプリケーションを完成させる必要に迫られるので、ぼくは大体爆速フレームワークのSinatraさんを使います。

ちょっと前のハッカソンで「だうれま.com」っていうWEBアプリケーションを作ったのですが、当然スピード重視なのでソースコードがいろいろひどかったりします。

まだ機能追加などしたかったりするので、リファクタリングしないとつらいなーなんて思ってユニットテストを入れようと思った次第。

英文おもしろ意訳投稿サービス
だれうま.com
http://dare-uma.com/

Sinatraアプリケーションのスケルトンを作る

まずはテストコードを置いといてSinatra, ActiveRecordを使って動くものを作ります。「Hello World」って表示されるだけのコードを書きます。

main.rb

DB設定はyamlで外だししてます。手軽にsqliteを使いますね。開発用(develop)とテスト用(test)の定義をしておきます。

config.yml

コマンドでsqliteのDBを作成しておきます。エラーが出ますが、一度sqlite内でコマンドを叩かないとDBファイルが作成されないだけなので気にしないこと。

必要なgemをGemfileに記述。

Gemfile

gemをまとめてインストールして、Sinatraアプリケーションを実行。

http://localhost:4567にアクセスして「Hello World」と表示されればOK。これでSinatraアプリケーションのスケルトンが出来上がり。

RSpec + FactoryGirlのスケルトンを作る

続いてRSpec + FactoryGirlが実行できるところまでやっていきますね。

APP_ROOT/model にModelクラスを作成します。内容は空で大丈夫です。

item.rb

Modelに対応するテーブルも作ります。本当はMigrationでやった方が楽なんですが、今回は直にSQLを叩いちゃいます。

開発用とテスト用両方にテーブルを準備します。テスト実施時に開発DBのテーブル定義をコピってやりたかったんですが情報を見つけれず。

RSpecを準備していきます。APP_ROOT/spec にspec_helper.rbを作成。

spec_helper.rb

FacotryGirl用のデータ定義ファイルを作成します。APP_ROOT/spec/factories にitem.rbを作成。

item.rb

実行するspecを書いて行きます。

main_spec.rb

テスト実行してみます。

ちゃんと通りましたね!これでSinatra + RSpec + FactoryGirlのスケルトンの出来上がりです。

参考までにディレクトリ構成を。
specやfactory周りはディレクトリ構成が異なると動かなかったりするので注意。

はまったポイント

最初、下記ページ見てやってたんですが、だいぶハマりました。
https://mikegriffin.ie/blog/20110413-more-with-sinatra-and-factorygirl/

下記のようにデータ定義を書けってなってるんですが、これだとテスト実行時にエラーになります。

“Factory”ではなく”FactoryGirl”と記述する必要があるし、定義構文もちょっと違いますね。FactoryGirlのバージョンが違ったりとかなんでしょうかね?

あとがき

SinatraにActiveRecord入れてRSpec・FactoryGirlまで入れるくらいならRailsで作っちゃえば?って気がしないでもない。

それでもぼくはSinatraさんが好きです!

The following two tabs change content below.
原田 敦

原田 敦

日本CAWのエンジニア。もふもふ部の部長。得意分野はRuby on Railsを使った小規模WEBアプリケーションを高速で開発すること。週末の楽しみは一人お菓子パーティー。三度の飯より小動物をもふもふするのが好きです。