プログラミング的なSomething

読者です 読者をやめる 読者になる 読者になる

プログラミング的なSomething

ITエンジニア(?)目線で生活・自転車・トレーニング話を綴ります

RSpecでのテストの書き方まとめ( & 先日作成したファクトリメソッド試行コードのテスト作成)

テストコード書いてないじゃんって気付いた

昨日作成したファクトリメソッドのテストコード書いてなかったので書きました。 順番逆ですけど大目にみてやってください。

ファクトリメソッドでインスタンス生成をクラス任せにする

早速テストコード

RSpecで書きました。適当なクラスが呼び出されていて、適当なテキストが吐かれていることを確認しています。

require './curry.rb'

describe BeafCurryFactory do
  before { @beafcurry = BeafCurryFactory.new }

  describe "when who tastes curry" do
    it "should be valid curry" do
      @beafcurry.review === BeafCurry
    end

    it "should be valid taste" do
      @beafcurry.review.taste.should == "この ビーフカレー おいしい"
    end
  end
end

describe MuttonCurryFactory do
  before { @muttoncurry = MuttonCurryFactory.new }

  describe "when who tastes curry" do
    it "should be valid curry" do
      @muttoncurry.review === MuttonCurry
    end

    it "should be valid taste" do
      @muttoncurry.review.taste.should == "この マトンカレー おいしい"
    end
  end
end

書き方とかまとめます

例によって以下の資料を参考にしています。

http://magazine.rubyist.net/?0021-Rspec

①describeメソッド

こんな感じ(describe BeafCurryFactory do)で書いている部分です。 describeメソッドの引数には、振る舞いを記述したいクラス、あるいはその説明を記述します。

#クラスだけでもいいし
describe BeafCurryFactory do
#説明を入れてもいい
describe BeafCurryFactory,"its a test" do
#説明だけでもいい
describe "its a test" do

振る舞い単位・クラス単位で区切るという観点から、私はBeaf(Mutton)CurryFactoryクラスをそれぞれdescribeで分割して書いています。

②itメソッド

プログラムの実行部分に相当します。 以下のように書きます。

it "should be valid curry" do
  @muttoncurry.review === MuttonCurry #エクスペクテーション
end

it"..."do ... endはエクスペクテーション(まあ要は実際にテストを担当するコード)を説明するブロックとなります。 itのあとは"should"が来ることが期待されていますので、英語で書きましょう。日本語でも大丈夫です

③beforeメソッド

テスト実行前に呼び出されるコードになります。 インスタンスの生成なんかを担当したりしますので、今回も以下のように@beafcurryを生成しています。

before { @beafcurry = BeafCurryFactory.new }

④エクスペクテーション

実際に処理を担当する部分です。以下のような記法で書きます。

instance.should matcher(expected)
instance.should_not matcher(expected) #期待している通り失敗する場合は_notを付ける

matcher部分はさまざまな記法がありますので都度確認してください。

RSpecの標準Matcher一覧表

すばらしいまとめがございましたので記載させていただきます。

④の補足

matcherには、インスタンスの持つメソッドを呼び出す以下のような書き方もあります。

instance.should be_hogehoge
#=> instance.hogehoge?に相当

適当なやりかたを模索していきましょう。