2021-01-04(Mon)
νλͺ©
λ΄μ©
νμ΅ λ μ§
2021-01-04(μ)
νμ΅ μκ°
12:00~24:00
νμ΅ λ²μ λ° μ£Όμ
루λΉμ¨λ μΌμ¦ λΌμ°ν , ν μ€νΈ
νμ΅ λͺ©ν
νΌννΈ λ£¨λΉμ¨λ μΌμ¦ λΌμ°ν , ν μ€νΈ μ±ν°λ₯Ό λ ννλ€.
λλ£ νμ΅ λ°©λ²
-
μμΈ νμ΅ λ΄μ©
μ± μ νμΌλ©° μλμ²λΌ κ°λ¨νκ² λ©λͺ¨λ₯Ό μ§ννλ€.
λΌμ°ν
RESTful μΈν°νμ΄μ€
RESTful μΈν°νμ΄μ€λ RESTμ νΉμ§μ κ°μ§ λΌμ°νΈλ₯Ό λ§νλ€. RESTλ HTTP λ©μλμ CRUDλ₯Ό λμμν€λ κ²μ΄λΌ μκ°νλ©΄ λλ€.
μΆμΆ: GET
μμ±: POST
λ³κ²½: PATCH
μ κ±°: DELETE
Railsλ μμΉμ μΌλ‘ RESTful μΈν°νμ΄μ€λ₯Ό κΈ°λ°μΌλ‘ λΌμ°νΈλ₯Ό μ€κ³νλ€. λΉRESTfulμ μΈ λΌμ°νΈλ₯Ό μ€μ ν μλ μμ§λ§, Railsμμ μ 곡νλ form_for
, url_for
, link_to
λ±μ λ·° ν¬νΌλ RESTful μΈν°νμ΄μ€λ₯Ό μ μ λ‘ μ€κ³λμ΄ μμΌλ―λ‘ μ λ§νλ©΄ RESTfulμ μΈ λΌμ°νΈλ₯Ό μ¬μ©νμ.
resources λ©μλ
RESTful μΈν°νμ΄μ€λ₯Ό μ μν λλ routes.rbμμ resources λ©μλλ₯Ό νΈμΆνλ€.
μλ₯Ό λ€μ΄ μλ μ½λλ₯Ό μ μΌλ©΄ μλ νμ²λΌ URLλ‘ μ‘μ μ΄ λ§€νλλ€.
URL
μ‘μ
HTTP λ©μλ
μν
/users(.:format)
index
GET
μ¬μ©μ λͺ©λ‘ μμ±
/users/:id(.:format)
show
GET
κ°κ°μ μ¬μ©μ μμΈ νλ©΄ μμ±
/users/new(.:format)
new
GET
μ κ· μ¬μ©μ μΆκ° νλ©΄ μμ±
/users(.:format)
create
POST
μ κ· μ¬μ©μ νλ©΄μΌλ‘λΆν°μ μ λ ₯μ λ°μ λ±λ‘ μ²λ¦¬
/users/:id/edit(.:format)
edit
GET
κΈ°μ‘΄μ μ¬μ©μ νΈμ§ νλ©΄ μμ±
/users/:id(.:format)
update
PATCH/PUT
νΈμ§ νλ©΄μΌλ‘λΆν° μ λ ₯μ λ°μ μμ μ²λ¦¬
/users/:id(.:format)
destory
DELETE
λͺ©λ‘ νλ©΄μμ μ νν λ°μ΄ν° μ κ±° μ²λ¦¬
λν resources λ©μλλ λ·° ν¬νΌ(link_to λ±)μμ μ¬μ©ν μ μλ Url ν¬νΌλ μλμΌλ‘ μμ±νλ€.
ν¬νΌ μ΄λ¦(_path
)
ν¬νΌ μ΄λ¦(_url
)
λ¦¬ν΄ κ°(κ²½λ‘)
users_path
users_url
/users
user_path(id)
user_url(id)
/users/:id
new_user_path
new_user_url
/users/new
edit_user_path(id)
edit_user_url(id)
/users/:id/edit
μ΄λ¬ν ν¬νΌλ₯Ό μ¬μ©νλ©΄ λ§ν¬λ₯Ό λ³΄λ€ μ§κ΄μ μΌλ‘ μ¬μ©ν μ μλ κ²μ λ¬Όλ‘ , λΌμ°νΈ μ μμ μμ‘΄νμ§ μμ μλ μλ€.
resource λ©μλ
resources λ©μλκ° μ¬λ¬ κ°μ 리μμ€λ₯Ό κ΄λ¦¬νλ RESTful μΈν°νμ΄μ€λ₯Ό μμ±νλ€λ©΄, resource λ©μλλ νλμ 리μμ€λ₯Ό κ΄λ¦¬νλ RESTful μΈν°νμ΄μ€λ₯Ό μμ±ν μ μλ€.
μλ₯Ό λ€μ΄ μλ μ½λλ₯Ό μ μΌλ©΄ μλ νμ²λΌ URLλ‘ μ‘μ μ΄ λ§€νλλ€.
URL
μ‘μ
HTTP λ©μλ
μν
/config(.:format)
show
GET
μ€μ μ 보 νλ©΄ νμ μμΈ νλ©΄ μμ±
/config/new(.:format)
new
GET
μ κ· μ€μ μΆκ° νλ©΄ μμ±
/config(.:format)
create
POST
λ±λ‘ νλ©΄μμ μ λ ₯μ λ°μ λ±λ‘ μ²λ¦¬
/config/edit(.:format)
edit
GET
κΈ°μ‘΄ μ€μ μμ νλ©΄ νμ
/config(.:format)
update
PATCH/PUT
μμ νλ©΄μμ μ λ ₯μ λ°μ μμ μ²λ¦¬
/config(.:format)
destroy
DELETE
μ§μ λ μ€μ μ 보λ₯Ό μ κ±° μ²λ¦¬
resources λ©μλμ λΉμ·νμ§λ§, index μ‘μ μ΄ μ μλμ§ μμμΌλ―λ‘ show, edit, delete λ±μμ :idλ₯Ό λ§€κ° λ³μλ‘ λ°μ§ μλλ€λ μ μ΄ λ€λ₯΄λ€.
μ°Έκ³ 1) resource λ©μλλ config 리μμ€κ° ConfigsControllerλ‘ λ§€νλλ€.
μ°Έκ³ 2)
http://localhost:3000/rails/info/routes
λ‘ μ κ·Όνλ©΄ λΈλΌμ°μ λ‘λ λΌμ°νΈ μ μλ₯Ό νμΈν μ μλ€.
RESTful μΈν°νμ΄μ€μ μ¬μ©μ μ μν
resources, resource λ©μλλ₯Ό μ¬μ©νλ©΄ RESTfulν μ νμ μΈ λΌμ°νΈλ₯Ό μλμΌλ‘ μμ±ν μ μλ€. νμ§λ§ μ€μ μ ν리μΌμ΄μ μ λ§λ λ€λ©΄ νμ€μ μΈ κ·μΉλ§μΌλ‘λ λͺ¨λ κ²μ ꡬνν μ μμΌλ―λ‘ μ€μν μ΅μ λ€μ΄ λκ° μλμ§λ νμΈν΄λ νμκ° μλ€.
λΌμ°νΈ λ§€κ° λ³μ μ μ½ μ‘°κ±΄ - contraints μ΅μ
μ¬μ€ λΌμ°νΈ λ§€κ° λ³μμ κ΄λ ¨λ μ ν¨μ± κ²μ¬λ λͺ¨λΈμμ νλ κ²μ΄ κΈ°λ³Έμ΄μ§λ§, λΌμ°νΈμμ μ²λ¦¬νλ©΄ μμΉ μλ κ°μ λ³΄λ€ νμ€νκ² μ°¨λ¨ν μ μλ€.
constraints: { <λ§€κ° λ³μ μ΄λ¦>: <μ κ· ννμ> }
ννλ‘ λΌμ°νΈ λ§€κ° λ³μμ μ μ½ μ‘°κ±΄μ μ§μ ν μ μλ€. μλμ²λΌ!
μ¬λ¬ κ°μ 리μμ€μ λμΌν μ μ½ μ‘°κ±΄μ λΆμ¬ν λλ λ€μκ³Ό κ°μ΄ λΈλ‘ νμμΌλ‘ μ μ½ μ‘°κ² λ μμ±ν μ μλ€.
볡μ‘ν μ μ½ μ‘°κ±΄ μ€μ - μ μ½ ν΄λμ€ μ μ
μ κ· ννμλ§μΌλ‘λ ννν μ μλ 볡μ‘ν μ μ½ μ‘°κ±΄μ μ€μ νκ³ μΆλ€λ©΄ μ μ½ ν΄λμ€λ₯Ό μ¬μ©νλ©΄ λλ€. μ μ½ ν΄λμ€μ 쑰건μ λ§λ€ λλ matches?
λ©μλλ₯Ό λ§λ€μ΄μ£ΌκΈ°λ§ νλ©΄ λλ€.
matches?
λ©μλλ λ€μκ³Ό κ°μ΄ κ·μΉμ μ§μΌμΌνλ€.
λ§€κ° λ³μλ‘ μμ² μ 보(request κ°μ²΄)λ₯Ό λ°μ.
λ¦¬ν΄ κ°μΌλ‘λ λΌμ°νΈλ₯Ό μ ν¨νν μ§μ λν true λλ falseλ₯Ό 리ν΄
μμλ₯Ό 보μ. μλμ²λΌ μ μ½ ν΄λμ€λ₯Ό μ μνλ€λ©΄,
μλμ²λΌ μ μ½ ν΄λμ€λ₯Ό λΆλ¬μμ constraint μ΅μ μΌλ‘ μ λ¬λ§ ν΄μ£Όλ©΄ λλ€.
form λ§€κ° λ³μ μ κ±° - form μ΅μ
resourcesμ resource λ©μλλ‘ μ μλ λͺ¨λ λΌμ°νΈλ ~(.:format)
μ΄ λΆμ΄μλ€. λ°λΌμ ~books.xml
λλ ~/books.json
μ²λΌ μΆλ ₯ νμμ νμ₯μ ννλ‘ μ§μ ν μλ μλ€.
νμ§λ§ 리μμ€μ λ°λΌμλ μ¬λ¬ νμμ λμνμ§ μμ μλ μλ€. μ΄λ° κ²½μ°μ format μ΅μ
μ falseλ‘ μ§μ νμ. κ·ΈλΌ URL ν¨ν΄μμ ~(.:format)
μ΄ μ κ±°λ λΌμ°νΈκ° μμ±λλ€.
컨νΈλ‘€λ¬ ν΄λμ€μ Url ν¬νΌμ μ΄λ¦ μμ - controllerμ as μ΅μ
resourcesμ resource λ©μλλ κΈ°λ³Έμ μΌλ‘ μ§μ λ 리μμ€ μ΄λ¦μ κΈ°λ°μΌλ‘ λμλλ 컨νΈλ‘€λ¬λ₯Ό κ²°μ νκ³ Url ν¬νΌλ₯Ό μμ±νλ€.
λͺ¨λ λ΄λΆμ 컨νΈλ‘€λ¬λ₯Ό 맡ν - namespaceμ scope λΈλ‘
컨νΈλ‘€λ¬ ν΄λμ€μ μκ° λ§μμ§λ©΄ λͺ¨λμ μ¬μ©ν΄ 컨νΈλ‘€λ¬λ₯Ό ν΄λλ‘ μ 리νκ³ μΆμ κ²½μ°κ° μμ κ²μ΄λ€. μλμ²λΌ 컨νΈλ‘€λ¬ ν΄λμ€λ₯Ό μμ±νλ©΄ λλ€.
μ΄λ κ² νλ©΄ Admin::BooksControllerκ° controllers/admin ν΄λ μλμ books_controller.rbλΌλ μ΄λ¦μΌλ‘ μμ±λλ€.
μ΄λ κ² λͺ¨λλ‘ μ»¨νΈλ‘€λ¬ ν΄λμ€λ₯Ό μμ±ν κ²½μ°μλ ν
νλ¦Ώμ /views/<λͺ¨λ μ΄λ¦>/<컨νΈλ‘€λ¬ μ΄λ¦>
ν΄λμ λ£μΌλ©΄ λλ€.
μ΄μ²λΌ λͺ¨λμ μ¬μ©ν 컨νΈλ‘€λ¬ ν΄λμ€μ RESTful μΈν°νμ΄μ€λ₯Ό μ μνλ €λ©΄ μλμ²λΌ namespace λΈλ‘μ μ¬μ©νλ©΄ λλ€. μ΄λ κ² νλ©΄ /admin/books
λλ /admin/books/:id
μ κ°μ URL ν¨ν΄κ³Ό, admin_books_path
λλ admin_book_path(id)
μ κ°μ URL ν¬νΌκ° μμ±λλ€.
λ§μ½μ λͺ¨λμ μΈμλ§ νκ³ URL ν¨ν΄κ³Ό URL ν¬νΌμλ μν₯μ μ£Όκ³ μΆμ§ μμ κ²½μ°μλ μλμ²λΌ scope λΈλ‘μ μ¬μ©νλ©΄ λλ€.
RESTful μΈν°νμ΄μ€μ μ‘μ
μΆκ° - collectionκ³Ό member λΈλ‘
collectionκ³Ό member λΈλ‘μ μ¬μ©νλ©΄ resourcesμ resource λ©μλλ‘ μλ μμλλ λΌμ°νΈ μΈμ μνλ μ‘μ μ μΆκ°ν μ μλ€.
collection λΈλ‘μ μ¬λ¬ κ°μ²΄λ₯Ό λ€λ£¨λ μ‘μ μ, member λΈλ‘μ νλμ κ°μ²΄λ₯Ό λ€λ£¨λ μ‘μ μ λ§λ€ λ μ¬μ©νλ€.
RESTful μΈν°νμ΄μ€μ μ‘μ
μ 무ν¨ν - onlyμ except μ΅μ
collection, member λΈλ‘κ³Ό λ°λλ‘ κΈ°λ³Έμ μΌλ‘ μμ±λλ μ‘μ μ μΌλΆλ₯Ό 무ν¨ννκ³ μΆμ λλ only λλ except μ΅μ μ μ§μ νλ€.
λΌμ°νΈ μ μλ₯Ό μΆκ° λλ 무ν¨ννλ κ²μ΄ μλλΌ νμ€ μ‘μ μΈ new μ‘μ , edit μ‘μ κ³Ό κ΄λ ¨λ URLμ λ³κ²½νκ³ μΆμ κ²½μ°μλ :path_names μ΅μ μ μ§μ νλ€.
κ³μΈ΅ ꡬ쑰λ₯Ό κ°μ§ 리μμ€ νν - resources λ©μλ μ€μ²©
리μμ€λ€μ΄ μ ν리μΌμ΄μ λ΄λΆμμ κ³μΈ΅ κ΄κ³λ₯Ό κ°λ κ²½μ°κ° μλ€. μλ₯Ό λ€μ΄, books 리μμ€(λμ μ 보)λ reviews 리μμ€(λμ 리뷰)λ₯Ό ν¬ν¨νλ€. μ΄λ¬ν 리μμ€ κ³μΈ΅ κ΄κ³λ has_many λλ belongs_to λ±μ λͺ¨λΈ AssociationμΌλ‘ λνλΈλ€.
μ΄λ¬ν 리μμ€(λͺ¨λΈ)μ κ΄κ³λ URLλ‘λ ννν΄μ£Όλ κ²μ΄ μ§κ΄μ μ΄λ€. κ°λ Ή λμ1μ 리뷰 μ 보λ ~/books/1/reviews
μ²λΌ λνλ΄λ κ²μ΄ μ’λ€.
μ΄λ¬ν κ΄κ³λ resourcesμ resource λ©μλλ₯Ό μ€μ²©ν΄μ λνλΈλ€.
μ΄λ¬λ©΄ URL ν¬νΌμ book_
μ΄λΌλ μ λμ¬κ° λΆλλ€. resourcesμ resource λ©μλλ κ³μν΄μ μ€μ²©ν μ μμ§λ§, κ³μΈ΅μ 2λ¨κ³ κΉμ§λ§ λ§λλ κ²μ΄ 무λνλ€.
리μμ€μ μμ μ€μ²© νν - shallow μ΅μ
μλμ²λΌ shallow μ΅μ μ μ°λ©΄ 'μμ URL'μ΄ μμ±λλ€.
λΌμ°νΈ μ μ μ¬μ΄μ© - concern λ©μλμ concerns μ΅μ
concern λ©μλλ₯Ό μ¬μ©νλ©΄ 곡ν΅λλ λ΄μ©μ μ¬λ¬ κ°μ λΌμ°νΈ μ μμ λ£μ μ μλ€.
RESTful νμ§ μμ λΌμ°νΈ μ μ
λͺ¨λ κ²μ RESTfulνκ² λ§λ€ μ μλ κ²μ μλλ€. μ΄λ΄ λ 무리ν΄μ RESTful μΈν°νμ΄μ€λ₯Ό μ μ©νλ € λ€μ§ λ§κ³ , κ°λ¨νκ² RESTful νμ§ μμ λΌμ°νΈλ₯Ό μ μν΄λ³΄μ.
match λ©μλ
RESTful νμ§ μμ λΌμ°νΈλ₯Ό μ μν λλ match λ©μλλ₯Ό μ¬μ©νλ€.
via μ΅μ μλ νΉλ³ν κ°μΌλ‘ :all(λͺ¨λ HTTP λ©μλ νμ©)μ μ§μ ν μλ μλ€. νμ§λ§ CSRF 곡격μ κ°μ μ μΈ μμΈμ΄ λλ―λ‘ κ°κΈμ μ¬μ©νμ§ λ§μ.
λ€μν RESTful νμ§ μμ λΌμ°νΈ νν
μμλ₯Ό 보μ.
λ£¨νΈ λ§€ν μ μ - root λ©μλ
루νΈμ λμνλ λΌμ°νΈλ₯Ό μ€μ ν λλ root λ©μλλ₯Ό μ¬μ©νλ€. root λ©μλλ μΌλ°μ μΌλ‘ routes.rbμ λ§μ§λ§μ μμ±νλ€.
ν
μ€νΈ
μλνλ ν μ€νΈμ μμ μ μ΄κ³ μ μ°ν μ ν리μΌμ΄μ μ λ§λλλ° νμμμλ€. Railsλ μ΄κΈ° λ²μ λΆν° μ΄λ° μλνλ ν μ€νΈλ₯Ό κ΅μ₯ν μ€μμνκ³ μκ³ , μλ ν μ€νΈλ€μ μ§μνλ€.
Unit ν μ€νΈ: λͺ¨λΈ λλ λ·° ν¬νΌμ λμ νμΈ
Functional ν μ€νΈ: 컨νΈλ‘€λ¬μ ν νλ¦Ώμ νΈμΆ κ²°κ³Ό νμΈ(μν μ½λ λλ ν νλ¦Ώ λ³μ λ·°μ μΆλ ₯ κ²°κ³Ό λ±)
Integration ν μ€νΈ: μ¬λ¬ κ°μ 컨νΈλ‘€λ¬λ₯Ό λλλ€λ©° μ¬μ©μμ μ€μ μ‘°μμ λͺ¨λ°©νκ³ κ²°κ³Ό νμΈ
ν μ€νΈ νλ μμν¬λ‘λ RSpec, minitest, Test::Unit λ±μ΄ μλ€. μ°Έκ³
μ± μμλ Test::Unitμ λν΄ μ€λͺ νλ€.
ν
μ€νΈ μ€λΉ
μ°μ ν μ€νΈλ₯Ό νλ €λ©΄ λ°μ΄ν°λ² μ΄μ€μ ν μ€νΈ μ μ© λ°μ΄ν°κ° νμνλ€. μμλ₯Ό λ°λΌκ°λ³΄μ.
1. ν
μ€νΈ λ°μ΄ν° λ² μ΄μ€ ꡬμΆ
μλμ²λΌ rake λͺ λ Ήμ΄λ₯Ό μ¬μ©ν΄μ ν μ€νΈ λ°μ΄ν°λ² μ΄μ€λ₯Ό ꡬμΆνλ€.
rake db:migrate
λͺ
λ Ήμ΄λ‘ λ―Έμ€ν λ§μ΄κ·Έλ μ΄μ
μ μ€ννκ³ , schema.rb
λ₯Ό μ΅μ μνλ‘ μ
λ°μ΄νΈν λ€μ rake db:test:load
λͺ
λ Ήμ΄λ‘ schema.rb
λ₯Ό κΈ°λ°μΌλ‘ νλ ν
μ€νΈ λ°μ΄ν°λ² μ΄μ€λ₯Ό μμ±νλ€. μ΄λ κ²λ§ νλ©΄ κ°λ° λ°μ΄ν°λ² μ΄μ€μ κ°μ κ΅¬μ‘°λ‘ ν
μ€νΈ λ°μ΄ν°λ² μ΄μ€κ° ꡬμΆλλ€.
ν μ€νΈ λ°μ΄ν°λ² μ΄μ€κ° μ ꡬμΆλμλμ§ ν μ€νΈ νκ²½ λ°μ΄ν°λ² μ΄μ€λ‘ μ μνμ¬ νμΈν μ μλ€. rails λ²μ λ³λ‘ λͺ λ Ήμ΄κ° λ€λ₯΄λ μ£Όμν κ².
Rails 3, 4:
rails dbconsole test
Rails 5, 6:
rails dbconsole -e test
2. ν μ€νΈ λ°μ΄ν° μ€λΉ
ν½μ€μ²λ₯Ό
test/fixtures
λλ ν 리μ λ£μ΄μ£Όμ.Unit ν μ€νΈ
Unit ν μ€νΈ(λ¨μ ν μ€νΈ)λ μ ν리μΌμ΄μ μ ꡬμ±νκ³ μλ λΌμ΄λΈλ¬λ¦¬(μ£Όμ λͺ¨λΈ λ±)κ° μ λλ‘ μλνλμ§ νμΈνλ ν μ€νΈμ΄λ€.
models ν μ€νΈ
/test/models
λ΄λΆμ μμ±λ μ€ν¬λ¦½νΈμ test λ©μλλ₯Ό μ΄μ©ν΄μ ν μ€νΈ ν¨μλ₯Ό λ§λ€μ΄μ£Όμ. μ΄ λ testλ©μλλ λ΄λΆμ μΌλ‘test_xxxx
λ©μλλ₯Ό μμ±νλ κ²λΏμ΄λ―λ‘test_
λ‘ μμνλ λ©μλλ₯Ό μ§μ μ μν΄λ μκ΄μλ€.μ΄ν
rake test:models
λͺ λ Ήμ΄λ‘ λͺ¨λΈ ν μ€νΈλ₯Ό μ€ννλ€. λ§μ½ νΉμ ν ν μ€νΈ μ€ν¬λ¦½νΈλ₯Ό μ§μ νκ³ μ€ννλ €λ©΄rake test:models ν μ€νΈ_μ€ν¬λ¦½νΈ_κ²½λ‘
λ₯Ό μ€νμν€λ©΄ λλ€.ν μ€νΈ λ©μλκ° μ¬λ¬ κ° μμ λλ μ€ν μμκ° λ§μλλ‘μ΄λ―λ‘ μ€ν μμμ μμ‘΄νλ ν μ€νΈ λ©μλλ μμ±νμ§ μλλ‘ νμ.
Railsλ ν μ€νΈλ₯Ό μ€νν λ ν½μ€μ²λ₯Ό λ°μ΄ν°λ² μ΄μ€μ λ‘λνλ κ²λΏλ§ μλλΌ, ν μ€νΈ μ€ν¬λ¦½νΈμμ μ΄μ©ν μ μκ² ν΄μλ‘ μ κ°νλ€.
μλ₯Ό λ€μ΄ books.yml λ΄λΆμ :islbλΌλ ν€λ‘ μ μλ λ μ½λκ° μλ€λ©΄, books(:jslib)μ μ κ·Όν μ μλ€.
view helper ν μ€νΈ
/test/helpers
ν΄λ λ΄λΆμ<컨νΈλ‘€λ¬>_helper_test.rb
μ²λΌ ν μ€νΈ μ€ν¬λ¦½νΈλ₯Ό λ§λ€κ³ μμtest
λ©μλλ‘ ν μ€νΈλ₯Ό μμ±ν λ€μrake test:helpers
λͺ λ Ήμ΄λ‘ μ€ννμ.μμλ λ§μ½ νΉμ ν ν μ€νΈ μ€ν¬λ¦½νΈλ₯Ό μ§μ νκ³ μ€ννλ €λ©΄
rake test:helpers ν μ€νΈ_μ€ν¬λ¦½νΈ_κ²½λ‘
λ₯Ό μ€νμν€λ©΄ λλ€.ν μ€νΈ μ€λΉμ λ€μ²λ¦¬ - setupκ³Ό teardown λ©μλ
ν μ€νΈ μ€ν¬λ¦½νΈμλ κ°κ°μ ν μ€νΈ λ©μλκ° νΈμΆλκΈ° μ κ³Ό νμ μλμΌλ‘ νΈμΆλλ μμ½ λ©μλκ° μλ€. ν μ€νΈ μ€ν¬λ¦½νΈμ λΆλͺ¨ ν΄λμ€
ActiveSupport::TestCase
μ μ μλμ΄ μλ λ©μλμ΄λ―λ‘ μ€λ²λΌμ΄λν΄μ μ¬μ©νλ€.κ°κ° λ¬΄μ¨ μν μ νλμ§ μ΄λ¦μμ λ± κ°μ΄ μ¨λ€.
setup: κ° ν μ€νΈ λ©μλκ° νΈμΆλκΈ° μ μ μ€ν(μ¬μ©ν 리μμ€ μ΄κΈ°ν)
teardown: κ° ν μ€νΈ λ©μλκ° νΈμΆλ μ΄νμ μ€ν(μ¬μ©ν 리μμ€ λ€μ²λ¦¬)
μλμ²λΌ μ°λ©΄ λλ€.
μ°Έκ³ λ‘ λ°μ΄ν°λ² μ΄μ€ ν½μ€μ²λ₯Ό μ½λ κ²κ³Ό μ κ±°λ Railsκ° μλμ μΌλ‘ μ²λ¦¬νλ―λ‘ setup λ©μλμμ λ°λ‘ μ€νν΄μ£Όμ§ μμλ λλ€.
Functional ν μ€νΈ
Functional ν μ€νΈ(κΈ°λ₯ ν μ€νΈ)λ 컨νΈλ‘€λ¬(μ‘μ )μ λμ λλ ν νλ¦Ώμ μΆλ ₯μ νμΈνκΈ° μν ν μ€νΈμ΄λ€. Functional ν μ€νΈμμλ λΈλΌμ°μ μ²λΌ HTTP μμ²μ μ μ¬μ μΌλ‘ μμ±νλ κ²μΌλ‘ μ‘μ λ©μλλ₯Ό μ€ννκ³ κ·Έ κ²°κ³Όλ‘ HTTP μν μ½λ, ν νλ¦Ώ λ³μ λλ μ΅μ’ μ μΈ μΆλ ₯ ꡬ쑰 λ±μ νμΈνλ€. λν, λΌμ°νΈ μ μμ μ ν¨μ±μ νμΈνλ κ²λ Functional ν μ€νΈμ μν μ΄λ€.
컨νΈλ‘€λ¬ test λ©μλ μμ±
/test/controllers
ν΄λ λ΄λΆμxxx_controller_test.rb
μ test λ©μλλ‘ ν μ€νΈλ₯Ό μμ±νλ€. μλλ μμ.ν μ€νΈ λ©μλλ₯Ό μμ±νλ κ² μ체λ Unit ν μ€νΈμ κ°μ§λ§, λͺ κ°μ§ Functional ν μ€νΈλ§μ ν¬μΈνΈκ° μλ€.
get λ©μλλ‘ μμ² μμ±
Functional ν μ€νΈμμλ μΌλ¨ 컨νΈλ‘€λ¬λ₯Ό μ€ννκΈ° μν΄ get λ©μλλ‘ HTTP μμ²μ μμ±νλ€.
μλλ λ§€κ° λ³μ μ 보λ₯Ό ν¨κ» μ λ¬νλ μμ !
Functional ν μ€νΈμμ μ΄μ©ν μ μλ μμ½ λ³μ
Functional ν μ€νΈμμλ get, post λ±μ λ©μλλ₯Ό μ¬μ©ν νμ μλ μμ½ λ³μμ μ κ·Όν μ μλ€.
λΆλ₯
λ³μ μ΄λ¦
μ€λͺ
κ°μ²΄
@controller
μμ²μ μ²λ¦¬ν 컨νΈλ‘€λ¬ ν΄λμ€
κ°μ²΄
@request
μμ² κ°μ²΄
κ°μ²΄
@response
μλ΅ κ°μ²΄
ν΄μ
assigns(:key), assigns['key']
λ·°μμ μ¬μ©ν μ μλ ν νλ¦Ώ λ³μ
ν΄μ
cookies[:key]
μΏ ν€ μ 보
ν΄μ
flash[:key]
νλμ μ 보
ν΄μ
session[:key]
μΈμ μ 보
Functional ν μ€νΈμμ μ¬μ©ν μ μλ assert_xxxx λ©μλ
Unit ν μ€νΈμμ μΌλ Assertion λ©μλ λ§κ³ λ Functional ν μ€νΈμμ μΆκ°λ‘ μΈ μ μλ Assertionκ° μλ€. μ€μν κ² λͺ κ°λ₯Ό μ 리ν΄λ³΄μλ©΄ μλμ κ°λ€.
assert_difference
λ©μλ: μ²λ¦¬ ν μν λ³ν νμΈassert_generates
λ©μλ: λΌμ°ν λμ νμΈassert_select
λ©μλ: ν νλ¦Ώ μΆλ ₯ κ²°κ³Ό νμΈ
Integration ν μ€νΈ
Integration ν μ€νΈ(ν΅ν© ν μ€νΈ)λ μ¬λ¬ κ°μ 컨νΈλ‘€λ¬λ₯Ό λλλ€λ©° μ€μ μ¬μ©μμ νλμ λͺ¨λ°©ν λ μ¬μ©νλ€.
μλ₯Ό λ€μ΄ μ± μμ ꡬννλ λ‘κ·ΈμΈ κΈ°λ₯μ κ²½μ° μλ μ μ°¨λ₯Ό λ°λ₯Έλ€. Integration ν μ€νΈλ‘ μ΄λ° λ¨κ³μ μΈ μ²λ¦¬λ₯Ό μ€μ λ‘ λͺ¨λ°©ν΄μ κ°κ°μ λ¨κ³μμ μ λλ‘ λ μ²λ¦¬κ° μ΄λ£¨μ΄μ§λμ§λ₯Ό νμΈν μ μλ€.
hello#view μ‘μ μ μ κ·Ό
λ―ΈμΈμ¦ μνμ΄λ―λ‘, login#index μ‘μ (λ‘κ·ΈμΈ νμ΄μ§)λ‘ λ¦¬λ€μ΄λ νΈ
λ‘κ·ΈμΈ νμ΄μ§μμ μ¬μ©μ μ΄λ¦κ³Ό λΉλ°λ²νΈλ₯Ό μ λ ₯νκ³ μΈμ¦ μ²λ¦¬
login#auth μ‘μ μμ μΈμ¦ μ²λ¦¬κ° μλ£λλ©΄ hello#view μ‘μ μΌλ‘ 리λ€μ΄λ νΈ
ν μ€νΈ μ€ν¬λ¦½νΈ μμ
ν μ€νΈ μ€ν¬λ¦½νΈ μμ±
Integration ν μ€νΈλ μ§μ
rails generate integration_test xxxxx
λͺ λ Ήμ΄λ‘ μμ±ν΄μ€μΌνλ€.ν μ€νΈ μ€ν¬λ¦½νΈ μμ± μμ μμλ‘ μ μ λ‘κ·ΈμΈ μ²λ¦¬λ₯Ό νμΈνλ μ½λ μμλ μλμ κ°λ€.
μ€κ° μ€κ°μ μλ
follow_redirect!
λ μλ΅μ μλ 리λ€μ΄λ νΈ λμμΌλ‘ λ€μ μμ²νλ κΈ°λ₯μ΄λ€. λ―ΈμΈμ¦ μνμ μ¬μ©μκ°/hello/view
μ μ κ·Όνλ©΄ λ‘κ·ΈμΈ νμ΄μ§λ‘ 리λ€μ΄λ νΈνλΌλ μλ΅μ λ°κ² λ ν λ°, μ΄ λ λ°μ 리λ€μ΄λ νΈ λμμΌλ‘ μ΄λνλ κ²μ λͺ¨λ°©νλ κ²μ΄λ€.ν μ€νΈ μ€ν¬λ¦½νΈ μ€ν
rake test:integration
λͺ λ Ήμ΄λ₯Ό μ¬μ©νλ©΄ ν μ€νΈλ₯Ό μ€νμν¬ μ μλ€.
νμ΅ λ΄μ©μ λν κ°μΈμ μΈ μ΄ν
RESTful, Test λ λͺ¨λ μ·¨μ κ³΅κ³ λ₯Ό 보면 μμ£Ό λ§λ μ μλ ν€μλμ λλ€. Railsλ₯Ό νμ΅νλ κ³Όμ μμ μ΄ λμ μ½κ°μ΄λλ§ λ§λ³Ό μ μλκ² μ’λ€μ. Railsλ₯Ό νμ΅ν λλ§λ€ nest.jsλ spring νμ΅μ μκ°μ μ°κ³ μΆλ€λ μκ°μ΄ μμλ€κΈ΄ νμ§λ§, μ΄λ° μμΌλ‘ 'λ°±μλ'μ νμν κ°λ κ³Ό κΈ°μ μ νμ€ν νμ΅ν΄λ²λ¦¬λ κΈ°νλ‘ μΌμμΌκ² μ΅λλ€.
λ€μ νμ΅ κ³ν
루λΉμ¨λ μΌμ¦ ν΄λΌμ΄μΈνΈλ¨ νκΈ°
Last updated
Was this helpful?