Rspecを使ってテストしてみる(2.0 + 1.0日目)

今日はrubyユニットテスト書いてみる。

目的としては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を利用するのが良さそう。

他にもありそうだが、今回は本筋と違うので飛ばす。

参考