-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
5. コントローラスペックの基礎 #4
Comments
なぜコントローラをテストするのか |
http://morizyun.github.io/blog/ruby-design-pattern-09-decorator/ 2015-01-24 9:04 GMT+09:00 tatsuyard [email protected]:
山田 昂平 Kohei Yamada |
次は! 整理 |
整理から |
|
match_arrayは配列の中身を確認しますが、順番は確認しません。順番が重要になる場合は代わりにeq使う |
POSTリクエストをテストするから |
postリクエストでは、params[:contact]に相当するものを渡す |
最後に、 expect の使い方が最初のexampleのときとわずかに異なる点に注目してください。今回はHTTPリクエスト全体を expect のブロックに渡しています。これはこれまで見てきた expect の使い方よりも少し複雑です。このHTTPリクエストはProcとして渡され、その結果が実行前と実行後の両方で評価されます。こうすると予期した変化が起きたかどうか(このexampleでは起き なかった かどうか、も)をシンプルに判定できます。 |
procようわからん |
patch と putの違いって? ・PUTメソッドは既存のリソースに対して、リソースの一部の変更であってもリソース全体を新たなバージョンとして更新を行うことを要求する。 ・一方、PATCHメソッドは既存のリソースに対して、リソースの一部分の更新を行うことを要求する。 |
SOAP 異なるコンピュータ上で動作するプログラム同士がネットワークを通じてメッセージを伝え合い、連携して動作するための通信プロトコル(規約)の一つ。メッセージの記述にXMLを、データ伝送に主にHTTPを用い、Webサービスの提供や利用に適しているとされる。 ... |
describe "POST #create" do
before :each do
@phones = [
attributes_for(:phone),
attributes_for(:phone),
attributes_for(:phone)
]
end
# 有効な属性の場合
context "with valid attributes" do
# データベースに新しい連絡先を保存すること
it "saves the new contact in the database" do
expect{
post :create, contact: attributes_for(:contact,
phones_attributes: @phones)
}.to change(Contact, :count).by(1)
end
# contacts#show にリダイレクトすること
it "redirects to contacts#show" do
post :create, contact: attributes_for(:contact,
phones_attributes: @phones)
expect(response).to redirect_to contact_path(assigns[:contact])
end
end
# 無効な属性の場合
context "with invalid attributes" do
# データベースに新しい連絡先を保存しないこと
it "does not save the new contact in the database" do
expect{
post :create,
contact: attributes_for(:invalid_contact)
}.not_to change(Contact, :count)
end
# :new テンプレートを再表示すること
it "re-renders the :new template" do
post :create,
contact: attributes_for(:invalid_contact)
expect(response).to render_template :new
end
end
end |
describe 'PATCH #update' do
before :each do
@contact = create(:contact,
firstname: 'Lawrence',
lastname: 'Smith')
end
# 有効な属性の場合
context "with valid attributes" do
p @contact
# データベースの連絡先を更新すること
it "locates the requested @contact" do
patch :update, id: @contact, contact: attributes_for(:contact)
expect(assigns(:contact)).to eq(@contact)
end
# @contact の属性を変更すること
it "changes @contact's attributes" do
patch :update, id: @contact,
contact: attributes_for(:contact,
firstname: 'Larry',
lastname: 'Smith')
@contact.reload
expect(@contact.firstname).to eq('Larry')
expect(@contact.lastname).to eq('Smith')
end
# 更新した連絡先のページへリダイレクトすること
it "redirects to the updated contact" do
patch :update, id: @contact, contact: attributes_for(:contact)
expect(response).to redirect_to @contact
end
end |
updateメソッドテストでの無効な属性の場合、 |
Started PATCH "/contacts/1" for 127.0.0.1 at 2015-02-21 09:04:41 +0900 Started GET "/contacts/1" for 127.0.0.1 at 2015-02-21 09:04:41 +0900 Started GET "/assets/jquery.js?body=1" for 127.0.0.1 at 2015-02-21 09:04:41 +0900 |
Started PATCH "/contacts/1" for 127.0.0.1 at 2015-02-21 09:11:00 +0900 Started GET "/assets/jquery.js?body=1" for 127.0.0.1 at 2015-02-21 09:11:00 +0900 |
DELETEから |
delete終わった |
matchと== |
高度なコントローラスペックから |
MK |
LGTM |
mk |
puts "MKーーーッ!" if current_user.admin? |
# 君がMKだと叫びたい
it "should puts MK----!" do
contact = create( :contact )
STDOUT.should_receive(:puts).with("MKーーーッ!")
get :show, id: contact
end |
# :MKと叫びたい
it "should puts MK----!" do
contact = create( :contact )
expect(STDOUT).to receive(:puts).with("MKーーーッ!")
get :show, id: contact
end |
it "should not require login" do
contact = create(:contact)
get :show, id: contact
expect(response).to render_template :show
end
# しかしMKと叫べない
it "should NOT puts MK----!" do
contact = create( :contact )
expect(STDOUT).not_to receive(:puts).with("MKーーーッ!")
get :show, id: contact
end |
require 'rails_helper'
describe UsersController do これが必要 |
スペックファイルの先頭に何のコントローラかを明示すること↑↑ |
コントローラスペックのクリーンアップ |
コントローラは不憫です。なぜならRails開発者は薄い(skinny)コントローラを良しとして(これは良いことですが)、あまりテストを書こうとしないからです(これは良くないです。このあと詳しく説明します)。しかし、私たちはもっとテストのカバレッジを上げていこうとしているので、次はコントローラのテストをターゲットにしましょう。
コントローラのテストで難しいところの一つは、コントローラがたくさんの要素に依存していることです。たとえばモデル同士の関連の仕方やルーティングの設定によって依存関係の複雑さが変わってきます。本章ではこうした難しさに対処していきます。一度全体を理解できれば、今後自分のソフトウェアでどのようにコントローラのスペックを書けば良いのかはっきり理解できるはずです。がんばりましょう。
この章ではやや早足で次のような内容を説明します。
The text was updated successfully, but these errors were encountered: