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部分はさまざまな記法がありますので都度確認してください。
すばらしいまとめがございましたので記載させていただきます。
④の補足
matcherには、インスタンスの持つメソッドを呼び出す以下のような書き方もあります。
instance.should be_hogehoge
#=> instance.hogehoge?に相当
適当なやりかたを模索していきましょう。