##リスト7.16のテストについて
今回出てきた、fill_inメソッド周辺がよくわからなかったので、少しだけ調べてみた。
####リスト7.16 ユーザー登録の基本的なテスト
require 'spec_helper'
2 describe "User pages" do
3
4 #RSpec.describe "UserPages", :type => :request do
5 #describe "GET /user_pages" do
6 # it "works! (now write some real specs)" do
7 # get user_pages_index_path
8 # expect(response).to have_http_status(200)
9 #end
10 #end
11 #end
12
13 subject { page }
14
15 describe "profile page" do
16 let(:user) { FactoryGirl.create(:user) }
17 before{ visit user_path(user) }
18
19 it{ should have_content(user.name) }
20 it{ should have_title(full_title(user.name)) }
21 end
22
23 describe "signup page" do
24 before { visit signup_path }
25
26 it{ should have_content('Sign up') }
27 it{ should have_title(full_title('Sign up')) }
28 end
29
30 describe "signup" do
31 before{ visit signup_path }
32
33 let(:submit){"Create my account"}
34
35 describe "with invalid information" do
36 it "should not create a user" do
37 expect{ click_button submit }.not_to change(User, :count)
38 end
39 end
40
41 describe "with valid information" do
42 before do
43 fill_in "Name", with: "Example User"
44 fill_in "Email", with: "user@example.com"
45 fill_in "Password", with: "foobar"
46 fill_in "Confirmation", with: "foobar"
47 end
48
49 it "should create a user" do
50 expect { click_button submit }.to change(User, :count).by(1)
51 end
52 end
53 end
54 end
Capybaraのメソッドfill_in
は、フォームへの入力をシュミレートするらしい。
visit signup_path
fill_in "Name", with: "Example User"
fill_in "Email", with: "user@example.com"
fill_in "Password", with: "foobar"
fill_in "Confirmation", with: "foobar"
fill_in "Name", with: "Example User"
例えば上記を実行することで、fill_in
後の"Name"に、with
後の文字列、"Example User"が入力されたことをシュミレートできている。
このブロックでは上記のシュミレーションを実行した後、
expect { click_button submit }.to change(User, :count).by(1)
ここでchange
メソッドを用いてボタンクリック前後のユーザー数が1だけ変化しているかどうかを観測している。
またこのexepct
メソッドは、従来のshould
メソッドと同等のものらしい。よって書き換えも可能で、
expect { click_button submit }.to
↓
{ click_button submit }.should
と書き換えられる...と思ったのだが。
どうやらshould
ではブロックを扱うことができないらしい。
よって正しくは
submit { click_button }.should
とする必要があった。
見た目的に、expect
の方がすっきりしてイイネ。