カバレッジの取得とテストの追加

カバレッジの取得

タイトルについて一段落付いたので、このあたりでコードカバレッジを測定してみます。以前は rcov というものがありましたが、Ruby 1.9 では正しく測定できないということで、SimpleCov というものに変わっています。さっそく Gemfile のテストの部分に追加し、bundle しておきます。

  # SimpleCov
  gem 'simplecov'
  gem 'simplecov-rcov'

Rspec 時に SimpleCov が起動するように設定しておきます。

require 'simplecov'
require 'simplecov-rcov'
class SimpleCov::Formatter::MergedFormatter
  def format(result)
    SimpleCov::Formatter::HTMLFormatter.new.format(result)
    SimpleCov::Formatter::RcovFormatter.new.format(result)
  end
end
SimpleCov.formatter = SimpleCov::Formatter::MergedFormatter
SimpleCov.start 'rails'

Guard を起動してみると、テスト終了後にカバレッジ測定が入ります。

Coverage report generated for RSpec to /Users/hkob/rails/moritaka-db/coverage. 80 / 81 LOC (98.77%) covered.
Coverage report Rcov style generated for RSpec to /Users/hkob/rails/moritaka-db/coverage/rcov

かなり意識して書いていたのですが、100% ではありませんでした。原因は get_objects_and_ids に対して id が渡されなかった場合の nil を代入する部分でした。controller の spec を書いていれば、この部分は cover できるのですが、Turnip においてモデルが一つしかない状況ではこの状況は発生させにくいです。この部分はあとでカバーすることにします。

英語版テストの追加

コードを記述している途中で実装漏れに気づいていたのですが、書き直すタイミングを逃してしまったので、ここでテストを追加して直してしまいます。app/helpers/application_helper.rb に記述した recursive_path ですが、@ids を取り込むようにしています。edit では id が @ids に登録されていますが、index における head は登録されていませんでした。このため、タイトル一覧ページで英語・日本語切替をすると常に「あ」の欄に移動してしまいます。この修正をする前に英語モードにおけるテストも追加しておきます。また、今回「ならば」の部分が見にくかったので一段インデントしてみました(その結果、昨日のものの間違いも見つかりました。インデント重要ですね)。最終的な feature は以下のようになりました。

# encoding: utf-8
# language: ja
機能: タイトルに関する CRUD を確認する
  シナリオ: タイトルページにアクセスする
    前提 トップページを表示する
    もし "[タイトル]" をクリックする
      ならば 画面に "タイトル一覧" と表示されていること
    もし "[English]" をクリックする
      ならば 画面に "List of titles" と表示されていること

  シナリオ: 運用環境ではタイトル追加ができない
    前提 運用環境である
    かつ タイトル一覧を表示する
      ならば 画面に "[タイトル追加]" と表示されていないこと

  シナリオ: 開発環境で新規タイトルを作成する
    前提 タイトル一覧を表示する
    もし "[タイトル追加]" をクリックする
      ならば 画面に "タイトル追加" と表示されていること
    もし "日本語""森高 千里" と入力する
    かつ "英語""Chisato Moritaka" と入力する
    かつ "読み""もりたか ちさと" と入力する
    かつ "登録する" ボタンをクリックする
      ならば 画面に "タイトル一覧" と表示されていること
      かつ 画面に "森高 千里" と表示されていること
    もし "[English]" をクリックする
      ならば 画面に "Chisato Moritaka" と表示されていること
    もし "[Add a title]" をクリックする
    かつ "Japanese""斉藤 英夫" と入力する
    かつ "English""Hideo Saito" と入力する
    かつ "Yomi""さいとう ひでお" と入力する
    かつ "Create Title" ボタンをクリックする
      ならば 画面に "Hideo Saito" と表示されていること
    もし "[Japanese]" をクリックする
      ならば 画面に "斉藤 英夫" と表示されていること
    もし "[も]" をクリックする
      ならば 画面に "斉藤 英夫" と表示されていないこと
      かつ 画面に "森高 千里" と表示されていること

  シナリオ: 運用環境で直接タイトル追加ページにアクセスさせない
    前提 運用環境である
    もし タイトル追加ページを表示する
      ならば 画面に "森高千里データベース" と表示されていること

  シナリオ: パラメータ設定が間違えていたときのエラー確認(新規タイトル)
    前提 タイトル追加ページを表示する
    もし "日本語""" と入力する
    かつ "英語""Chisato Moritaka" と入力する
    かつ "読み""もりたか ちさと" と入力する
    かつ "登録する" ボタンをクリックする
      ならば 画面に "タイトル一覧" と表示されていないこと
      かつ 画面に "日本語を入力してください。" と表示されていること
    もし "日本語""森高 千里" と入力する
    かつ "英語""" と入力する
    かつ "登録する" ボタンをクリックする
      ならば 画面に "タイトル一覧" と表示されていないこと
      かつ 画面に "英語を入力してください。" と表示されていること
    もし "英語""Chisato Moritaka" と入力する
    かつ "読み""" と入力する
    かつ "登録する" ボタンをクリックする
      ならば 画面に "タイトル一覧" と表示されていないこと
      かつ 画面に "読みを入力してください。" と表示されていること
    もし "読み""ABC" と入力する
    かつ "登録する" ボタンをクリックする
      ならば 画面に "タイトル一覧" と表示されていないこと
      かつ 画面に "読みは不正な値です。" と表示されていること
    もし タイトル追加ページを表示する
    かつ "[English]" をクリックする
    かつ "Japanese""" と入力する
    かつ "English""Chisato Moritaka" と入力する
    かつ "Yomi""もりたか ちさと" と入力する
    かつ "Create Title" ボタンをクリックする
      ならば 画面に "List of titles" と表示されていないこと
      かつ 画面に "Japanese can't be blank" と表示されていること
    もし "Japanese""森高 千里" と入力する
    かつ "English""" と入力する
    かつ "Create Title" ボタンをクリックする
      ならば 画面に "タイトル一覧" と表示されていないこと
      かつ 画面に "English can't be blank" と表示されていること
    もし "English""Chisato Moritaka" と入力する
    かつ "Yomi""" と入力する
    かつ "Create Title" ボタンをクリックする
      ならば 画面に "List of titles" と表示されていないこと
      かつ 画面に "Yomi can't be blank" と表示されていること
    もし "Yomi""ABC" と入力する
    かつ "Create Title" ボタンをクリックする
      ならば 画面に "List of titles" と表示されていないこと
      かつ 画面に "Yomi is invalid" と表示されていること

  シナリオ: 開発環境でタイトルを編集する
    前提 タイトルにダミーデータを登録する
    もし タイトル一覧を表示する
    かつ id が "あいうえお" である行の "[編集]" をクリックする
      ならば 画面に "タイトル編集(あいうえお)" と表示されていること
    もし "日本語""森高 千里" と入力する
    かつ "英語""Chisato Moritaka" と入力する
    かつ "読み""もりたか ちさと" と入力する
    かつ "更新する" ボタンをクリックする
      ならば 画面に "タイトル一覧" と表示されていること
      かつ 画面に "森高 千里" と表示されていること
    もし タイトルにダミーデータを登録する
    かつ タイトル一覧を表示する
    かつ "[English]" をクリックする
    かつ id が "AIUEO" である行の "[Edit]" をクリックする
      ならば 画面に "Edit the title(AIUEO)" と表示されていること
    かつ "Japanese""斉藤 英夫" と入力する
    かつ "English""Hideo Saito" と入力する
    かつ "Yomi""さいとう ひでお" と入力する
    かつ "Update Title" ボタンをクリックする
      ならば 画面に "List of titles" と表示されていること
      かつ 画面に "Hideo Saito" と表示されていること

  シナリオ: パラメータ設定が間違えていたときのエラー確認(タイトル編集)
    前提 タイトルにダミーデータを登録する
    もし タイトル一覧を表示する
    かつ id が "あいうえお" である行の "[編集]" をクリックする
    もし "日本語""" と入力する
    かつ "英語""Chisato Moritaka" と入力する
    かつ "読み""もりたか ちさと" と入力する
    かつ "更新する" ボタンをクリックする
      ならば 画面に "タイトル一覧" と表示されていないこと
      かつ 画面に "日本語を入力してください。" と表示されていること
    もし "日本語""森高 千里" と入力する
    かつ "英語""" と入力する
    かつ "更新する" ボタンをクリックする
      ならば 画面に "タイトル一覧" と表示されていないこと
      かつ 画面に "英語を入力してください。" と表示されていること
    もし "英語""Chisato Moritaka" と入力する
    かつ "読み""" と入力する
    かつ "更新する" ボタンをクリックする
      ならば 画面に "タイトル一覧" と表示されていないこと
      かつ 画面に "読みを入力してください。" と表示されていること
    もし "読み""ABC" と入力する
    かつ "更新する" ボタンをクリックする
      ならば 画面に "タイトル一覧" と表示されていないこと
      かつ 画面に "読みは不正な値です。" と表示されていること
    もし タイトル一覧を表示する
    かつ "[English]" をクリックする
    かつ id が "AIUEO" である行の "[Edit]" をクリックする
    もし "Japanese""" と入力する
    かつ "English""Chisato Moritaka" と入力する
    かつ "Yomi""もりたか ちさと" と入力する
    かつ "Update Title" ボタンをクリックする
      ならば 画面に "タイトル一覧" と表示されていないこと
      かつ 画面に "Japanese can't be blank" と表示されていること
    もし "Japanese""森高 千里" と入力する
    かつ "English""" と入力する
    かつ "Update Title" ボタンをクリックする
      ならば 画面に "タイトル一覧" と表示されていないこと
      かつ 画面に "English can't be blank" と表示されていること
    もし "English""Chisato Moritaka" と入力する
    かつ "Yomi""" と入力する
    かつ "Update Title" ボタンをクリックする
      ならば 画面に "タイトル一覧" と表示されていないこと
      かつ 画面に "Yomi can't be blank" と表示されていること
    もし "Yomi""ABC" と入力する
    かつ "Update Title" ボタンをクリックする
      ならば 画面に "タイトル一覧" と表示されていないこと
      かつ 画面に "Yomi is invalid" と表示されていること

  シナリオ: 開発環境でタイトルを削除する
    前提 タイトルにダミーデータを登録する
    もし タイトル一覧を表示する
    かつ id が "あいうえお" である行の "[削除]" をクリックする
      ならば 画面に "タイトル一覧" と表示されていること
      かつ 画面に "あいうえお" と表示されていないこと
    もし タイトルにダミーデータを登録する
    かつ タイトル一覧を表示する
    かつ "[English]" をクリックする
    かつ id が "AIUEO" である行の "[Delete]" をクリックする
      ならば 画面に "List of titles" と表示されていること
      かつ 画面に "AIUEO" と表示されていないこと

このテストを通過させるために、app/controllers/titles_controller.rb の index メソッドの最後に以下の文を追加します。

    @ids = { head:@head }

これでタイトルに関するテストは show を除き完成です。

written by iHatenaSync