Rspecを使ってテストしてみる(2.0 + 1.0日目)
目的としてはrubyによる書き方を学ぶこと。なので、実際に品質が担保できているかは今回見ない
テストの対象は昨日書いたFizzBuzz
で。
Rspecをインストール
まず、ユニットテストを書くためにrspecをインストールする
$ gem install rspec
Rspecの初期設定
$ rspec --init
これでユニットテストに必要なファイルは揃った。
ファイル構成は以下の通り
次からテストコードを書いていく。
テストコード
spec
ディレクトリにfizzbuzz_spec.rb
を作成する。
テストコードのファイルには_spec
って接尾語を入れるらしい。
#!/usr/bin/env ruby # encode: utf-8 require "spec_helper" require_relative "../fizzbuzz.rb" describe FizzBuzz do it "count 10" fizzbuzz = FizzBuzz.new expect(fizzbuzz.size).to eq 10 end
describe
の後ろにはテスト対象のクラスを記述する。
実際に行うテストはit
以降に記述する。
expect
メソッドにテスト対象クラスのメンバ変数を指定し、
それが実際の値と同じかを検査している。
いざ、これを実行すると見事に失敗する。
失敗の原因はこちら
Failure/Error: expect(fizzbuzz.size).to eq 10 expected: 10 got: nil
単純にインスタンスを生成しただけでは、sizeが入らないのでそもそもテストに失敗する。
なので、FizzBuzzクラスを書き換える。
def initialize(size=10) if size.size == 1 && n[0].to_i != 0 @size = size[0].to_i else @size = size end end
initializeメソッドでsizeを決定するように修正した。
引数に整数が入っていれば、その値を。そうでなければデフォルト値の10が入るようになっている。
これでテストを実行すると、成功!
ついでに値を指定した時のテストもしてみる。
以下をテストコードに追加
# 30が指定された時に30を返す it "count 30" do fizzbuzz = FizzBuzz.new 30 expect(fizzbuzz.size).to eq 30 end
これも成功!
とりあえず、今日はここまで。
試行錯誤
FizzBuzzクラスが読み込めない
#!/usr/bin/env ruby # encode: utf-8 require "spec_helper" require "fizzbuzz" describe FizzBuzz do it "count 10" end
ただ、これだとエラーが表示される。
エラーの内容は以下
`require': cannot load such file -- fizzbuzz (LoadError)
ようは見つからないよってことみたい。
調べてみたところ、こちらが参考になった。
要は実行するときに同じ階層を読み込むがfizzbuzz.rb
が同じ階層にないため、エラーしていた。
ファイルの階層を変更するのはちょっと違うので、require_relative
を使えば良いとのこと。
このrequire_relative
は今の位置から相対パスでrequireしてくれる。
単にrequire
だとエラーしてしまうので、require_relative
を利用するのが良さそう。
他にもありそうだが、今回は本筋と違うので飛ばす。