3章のRSpecを書く項目まできた。これまで自分や特定の人が使う物しか書いた事がなかったので、テストという物を書いた事がなかった。テスト駆動開発などの開発手法を勉強する良い機会。

ちなみにプログラミングでいうテストとは単純な「動作確認」とは少し意味が違う。テスト用のフレームワークを用いた、プログラムのあるべき姿を定義するみたいな物かな。まだ勉強中でとんちんかんな事言ってるかもしれない。

とりあえずRailsチュートリアルのテストを書いてみる。手始めにspec/spec_helper.rbにrequire "minitest"config.include Capybara::DSLを書かなくてはいけないので気をつける。で、実際のテストがこんな感じ。

require 'spec_helper'

describe "Static pages" do

  let(:base_title) {"Ruby on Rails Tutorial Sample App"}

  describe "Home page test" do
    it "コンテンツ内に'Sample'がなくてはいけない" do
      visit '/static_pages/home'
      expect(page).to have_content('Sample App')
    end
    it "titleが'Home'でなくてはいけない" do
      visit '/static_pages/home'
      expect(page).to have_title("#{base_title} | Home")
    end
  end

end

descriceが分類で、今回は”Static pages”と書いてあるけど、ここはテスト対象のクラスとかでもイイみたい。そしてネストして書ける。

itが実際のテスト内容。it1つにつきテスト1個が正しいみたい。letは変数的な物かな。もう少し色々書けるみたいだけど。

visitでページにアクセスする部分てかDSLがcapybaraらしい。capybaraは「Capybara helps you test web applications by simulating how a real user would interact with your app.」だからブラウザでの挙動テストを書きやすくした物なのね。

visitでアクセスしたページがpageに代入されて、expect(page)でテスト対象にできる、みたいな感じなのかな?

ちなみにGithubのjnicklas/capybaraのReadmeを見てみたらこんな事も書けるみたい。

describe "the signin process", :type => :feature do
  before :each do
    User.make(:email => 'user@example.com', :password => 'password')
  end

  it "signs me in" do
    visit '/sessions/new'
    within("#session") do
      fill_in 'Email', :with => 'user@example.com'
      fill_in 'Password', :with => 'password'
    end
    click_button 'Sign in'
    expect(page).to have_content 'Success'
  end
end

これは少し前にブラウザ操作でSeleniumを書いたから分かりやすかった。まず(before)Userクラスにテストで使う用のユーザーデータを作っておいて、/sessions/newにアクセスした後、#sessionにEmail/Passwordを入力、送信。その後のページがテスト対象で、have_contentだからページ内のどこかに’Success’があればテストが通るといった具合か。

ページのテストは少し書けそうな気がする。けど、メソッドのテストとかは慣れないと大変そうだなぁ。テストを書いて、RED==失敗させて、GREEN==成功させるコードを書くのが本来のテスト駆動開発。まずテストを書けるぐらい設計してから書こうねって話なのか。

とりあえず簡単なテストから書いてみてみようかな。まだ「テスト書いておけば良かった!」という場面になった事がないから実感が無いのだろう。