일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- form
- fixture
- mysql
- apache spark
- uploader
- Migration
- Hadoop
- rubyonrails
- 점심영어스터디
- RoR
- programmingTip
- Ruby on Rails
- TIP
- activerecord
- fileUploader
- Scala
- 삽질기
- programming
- minitest
- java
- Linux
- Rails
- Ruby
- transaction
- test
- Shell
- carrierwave
- max중첩
- share
- 전화영어
Archives
- Today
- Total
아침바라기의 이야기
[Ruby] Fixture 작성 방법 본문
비슷한 주제인 Mini test를 이용한 모델 테스트 팁은 이전에 한번 다뤘다.
주의점이 한가지 있다. Fixture는 개수가 많아지면 속도가 느려진다.
현재 DB의 데이터를 모두 지웠다가 Fixture 데이터를 넣고 테스트가 완료 되면 롤백한다. 이 과정을
진행하다보니 기존에 데이터가 많거나 Fixture 수가 늘어나면 늘어날수록 느려진다.
이걸 해결하려면 test_helper.rb에서
class ActiveSupport::TestCase fixtures :all
이 부분을 수정하는 것이 좋다.
각 테스트 케이스 setup 에서 fixture를 로딩하도록 만들거나 헬퍼를 통해서 필요한 것만 로딩하는 걸 만들어주도록 한다.
Fixture는 YML 형태로 보통 사용한다
아래는 예제다.
# users.yml daniel: name: Daniel job: programmer workplace : google son: name: son job: judgement workplace: unknown
테스트에서는 아래와 같이 사용할 수 있다. users.yml이면 .yml 만 뺀 형태 메소드를 레일즈에서 제공한다.
class UserTest < ActiveSupport::TestCase test "test user" do assert_equal "Daniel", users(:daniel) end end
동적인 데이터도 만들어줄 수 있는데 ERB 형태로 fixture 데이터를 생성할 수 있다.
<% 1.upto(100) do |idx| %> fix_<%= idx %>: id: <%= idx %> name: person_<%= idx %> created_at: <%= DateTime.now %> option: nil <% end %>
100개의 fixture 데이터를 만들었다. (option은 nil값이 들어가고 created_at은 현재 시간이 지정된다.
fixture로 belongs_to, has_one, has_many 관계가 있다고 생각하자. 레일즈는 fixture에 정의한 label을 이용해서 연결해준다.
아래는 예다.
# class User < ActiveRecord::Base 내부 선언 belongs_to :job # class Job < ActiveRecord::Base 내부 선언 has_many :users # users.yml daniel: name: Daniel job: programmer workplace : google kim: name: Kim job: programmer workplace : google son: name: son job: judgement workplace: unknown # jobs.yml programmer: name: Programmer judgement: name: Judgement
user 클래스 객체에서 job에 접근을 할 수 있다.
이제 시점을 전환해서 데이터 관점에서 바라보자.
users 테이블에서 보면 job_id 가 정의되어 있다. job_id는 jobs fixture에 들어간 id나 자동 생성 id가 들어가는걸 볼 수 있다.
label을 이용하면 자동으로 세팅을 레일즈가 해준다. 임의적으로 조인하는 경우(belongs_to 같은 관계 없이)엔 직접 id 설정을 해야한다.
아래가 그 예제이다.
# users.yml daniel: name: Daniel job_id: 1 workplace : google kim: name: Kim job_id: 1 workplace : google son: name: son job_id: 2 workplace: unknown # jobs.yml programmer: id: 1 name: Programmer judgement: id: 2 name: Judgement
ordering 테스트를 만들 때(인덱스 만들기 귀찮아서 id를 쓰는 경우..)도 id를 직접 지정하는 편이 낫다.
참고
Fixtures API 문서 : 최신 버전 API 문서엔 사용법이 안나와있다(깃헙에 가보면 주석으로 있긴하다)
'개발이야기 > Ruby on Rails' 카테고리의 다른 글
[Rails] ActiveRecord::FixtureSet.identify (0) | 2015.11.03 |
---|---|
Active Record Scope 정리 (0) | 2015.10.24 |
[Rails] Minitest를 이용한 모델 테스트 팁 (0) | 2015.10.23 |
[Rails] 트랜잭션 사용법 (0) | 2015.10.21 |
Carrierwave Uploder로 동적 이미지 version 생성법 (0) | 2015.10.07 |