blog @arfyasu

プログラミングとか趣味のこととか

Ruby のプロジェクトで RSpec のテストがパスするまで

はじめに

仕事で Rails を使わないピュアな Ruby のプロジェクトで開発をすることになり、RSpec のテストがパスするまでに少々はまったので、恥を忍んでまとめておきます。

RSpec を動かすまでの手順については、こちらのサイトの手順を参考にさせて頂きました。 qiita.com

環境

rbenv 1.0.0
ruby 2.3.0

事前準備

rbenv で ruby をインストールしておいて下さい。

ディレクトリ構成

今回作成するプロジェクトのディレクトリ構成です。
ソースコードは src 以下に、テストコードは sprc 以下に作成します。

rspec_sample
├── Gemfile
├── Gemfile.lock
├── src
└── spec

初期設定

プロジェクトのディレクトリを作成し移動します。
ついでに、ソースを作成する src フォルダも作成しておきます。

$ mkdir rspec_sample
$ cd rspec_sample/
$ mkdir src

rbenv で使用する ruby のバージョンを指定します。
bunlder をインストールしていない場合、インストールします。

$ rbenv local 2.3.0
$ gem install bundler

bundler にて rspec をインストール

bundler を初期化しGemfile を生成します。

$ bundle init

Gemfileを以下のように修正します。

source "https://rubygems.org"

gem "rspec"

rspec をインストールします。

$ bundle install --path vendor/bundle

rspec の初期設定

.rspec, spec/spec_helper.rb を生成します。

$ bundle exec rspec --init
  create   .rspec
  create   spec/spec_helper.rb

src 以下のファイルを読み込むよう、spec_helper の最後に以下を追記します。

Dir.glob(File.join(File.dirname(__FILE__), "../src/**/*.rb")).each { |f| require f }

上記を追加することで、各 spec ファイルの先頭で必要なファイルを読込まなくても

require 'spec_helper'

をしてあげれば事足りてしまいます。
Rails ぽくて良い感じです。

コードの作成

以下のような構成になるようファイルを生成します。

rspec_sample
├── Gemfile
├── Gemfile.lock
├── src
│   ├── libs
│   │   └── message.rb
│   └── person.rb
└── spec
    ├── libs
    │   └── message_spec.rb
    ├── person_spec.rb
    └── spec_helper.rb

libs/message.rb の作成

src/libs/mesage_spec.rb

spec/libs/mesage_spec.rb

上記を作成して、rspec を実行します。

$ bundle exec rspec

結果がグリーンになってますね。なっているはずです!

person.rb の作成

src/person.rb

message.rb をロードする際、require_relative を使って、相対パスでファイルをロードします
require 'libs/message'のように指定して rspec を実行すると、下記のようなエラーが表示されます。

LoadError: cannot load such file -- libs/message

Rails を使用するとファイルの読込はフレームワーク側でやってくれるので意識する必要はありませんが、今回ここではまりました(^^;

sprc/person_spec.rb

message_spec と同様に、先頭に require 'spec_helper' すればいいのでスマートですね!

上記を作成して、rspec を実行します。

$ bundle exec rspec

結果がグリーンになっていればOKです。

最後に

Rails を使っているときには気づきませんでしたが、Rails の便利さに如何に頼っているかを思い知らされますね。
逆に、Rails を使わないと出来ないことが多いのは、それだけ Rails が優秀だということにもなりますが、、、

RSpec を動かすのに、require_relative ではまるとは...
自分のあまりの無知っぷりに恥ずかしくなりました。

それでも、Ruby という言語を理解できていないからこそ、問題に直面したときに自力で解決できないと思うので、Rails のことを学ぶことも大事ですが、その言語自体をきちんと理解することが大事だと改めて思いました。

今回のサンプルコードと Ruby のプロジェクトのテンプレートをgithub にpushしたので、こちらもよければお使いください。

Effective Ruby

Effective Ruby