22. Turnip による受入テスト(4)

リンクの修正

コントローラのテストが終了したので、再度受入テストを確認してみる。Guard でリターンを押すと以下のようなエラーになっている。これは年度を変更するリンクが作成されていないためである。

     Failure/Error: ならば "[平成27年度]"と表示されていること
       expected to find text "[平成27年度]" in "[校務支援システムv3] 品川 ●[品川] [荒川] 前期中間 ●[前期中間] [前期] [後期中間] [後期] [学年末] メニュー [クラス] [教職員] [学生] 教務 [成績処理] [時間割] 室関係 [入試・広報] [進路] 共通 [会計] [施設] [統計] [設定] [ログアウト] 平成26年度・ユーザ名 [Home] 年度変更 × 平成27年度を作成しました。 年度一覧 和暦 西暦 デフォルト年度 平成27年度 2015 × 平成26年度 2014 ○"

まず、app/views/teacher/years/index.html.haml に注釈を追加する。

%p 年度を変更するには、和暦のリンクをクリックしてください。

さらに、和暦の部分をリンクに変更する。さまざまな権限のページで年度変更処理を書くのは面倒なので、すべての権限への振り分けを行っている root_path で処理を行う。

        %td= link_to lh(year.wareki_nendo), root_path(year_id:year.id)

リンクが修正されたので、テストは進むが実際の変更処理はしていないので、平成26年度のままである。

     Failure/Error: ならば "平成27年度・"と表示されていること
       expected to find text "平成27年度・" in "[校務支援システムv3] 品川 ●[品川] [荒川] 前期中間 ●[前期中間] [前期] [後期中間] [後期] [学年末] メニュー [クラス] [教職員] [学生] 教務 [成績処理] [時間割] 室関係 [入試・広報] [進路] 共通 [会計] [施設] [統計] [設定] [ログアウト] 平成26年度・ユーザ名 [Home] 教務室トップページ 年度に関する情報 リンク 内容 権限 [年度変更] 処理年度を変更します。 教務室 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19"

年度変更処理の追加

welcome#index にて年度が変更できるように修正する。実装の前にテストを記述する。

  describe 'GET index' do
    context 'for :skyoumu' do
      before do
        login_user_as :skyoumu, controller
      end

      context 'without year_id' do
        before do
          expect(controller).to_not receive(:set_to_each_session)
          get :index
        end
        it { expect(response).to redirect_to(teacher_kyoumus_path) }
      end
      
      context 'with year_id and can obtain year' do
        before do
          expect(Year).to receive(:find).with('1') { double(Year, year: 2015) }
          expect(controller).to receive(:set_to_each_session).with('now_year_id', '1')    
          get :index, year_id: '1'
        end
        it { expect(response).to redirect_to(teacher_kyoumus_path) }
      end
      
      context 'with year_id and can not obtain year' do
        before do
          expect(Year).to receive(:find).with('1') { nil }
          expect(controller).to_not receive(:set_to_each_session)
          get :index, year_id: '1'
        end
        it { expect(response).to redirect_to(teacher_kyoumus_path) }
      end

このテストを通過させるために、実装を修正する。year_id がある場合には、対応する year を取得し、見つかれば session に設定する。

    if yid = params[:year_id]
      year = Year.find(yid)
      each_session['now_year_id'] = yid if year
    end
  # @param [Symbol] key セットする session キー
  # @param [Object] セットする値
  def set_to_each_session(key, value)
    session = each_session    
    session[key] = value if session
  end

この結果、受入テストは以下のようにすべて通過した。

年度の追加、変更
  教務室のトップページから年度変更に飛び、新規年度を作成し、年度を変更する
    前提教務室でログインする -> ならば"平成26年度・"と表示されていること -> もし"[年度変更]"リンクをクリックする -> ならば年度一覧と表示されていること -> もし"平成27年度を作成"ボタンをクリックする -> ならば"[平成27年度]"と表示されていること -> もし"[平成27年度]"リンクをクリックする -> ならば"平成27年度・"と表示されていること

LDAP エラーのテスト

コードカバレッジを調べたところ LDAP サーバのエラーが合ったときの実装が未通過であった。ほとんど起こることはないがちゃんとテストをしておく。stub で LdapException を発生させて、該当部分が動作することを確認した。

    context 'when LDAP server has errors' do
      it 'should render status:500' do
        login_user_as :skyoumu, controller
        expect(controller).to receive(:user_signed_in?).and_raise DeviseLdapAuthenticatable::LdapException
        get :index
        expect(response.status).to eq 500
      end
    end

written by iHatenaSync