섭사장의 블로그

Ruby on Rails test

February 13, 2019 | 4 Minute Read

test

Ruby on Rails는 테스트 자동생성을 포함하고 있다. Model이나 Controller가 생성될 때 skeleton test code를 함께 만들기 때문에 쉽게 테스트를 작성하고 진행할 수 있다. test 관련 파일들은 /test/ 안에 존재한다.

fixtures

Ruby on Rails가 테스트를 진행할 때 data는 DB에서 가져오지 않는다. /test/fixtures/에 위치한 fixtures에서 가져오게 된다. 그렇기 때문에 Model 테스트를 위해서는 fixtures를 미리 설정해야 한다. fixtures는 테스트할 때 사용할 만큼만 생성하면 된다. ERB도 사용할 수 있기 때문에, 여러 데이터가 필요할 경우 반복문을 활용할 수 있다. 아래의 fixture는 예시이다.

one:
  title: MyString
  description: Lorem ipsum dolor sit amet, consectetur adipiscing elit.
  posted_at: 2019-02-13
  category: 1

참고: https://api.rubyonrails.org/v2.3/classes/Fixtures.html

models test

/test/models/에 위치한다. MVC의 M에 해당하는 테스트를 진행한다.

setup do
  @post = Post.new(title: "title", description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit.", posted_at: Time.now, category: 1)
end

test "should be valid" do
  assert @post.valid?
end

test "title should be present" do
  @post.title = "   "
  assert_not @post.valid?
end

test "title should be shorter than 60" do
  @post.title = "a" * 61
  assert_not @post.valid?
end

test "category should be integer" do
  invalid_categories = ["a", 2.71828]
  invalid_categories.each do |invalid_category|
    @post.category = invalid_category
    assert_not @post.valid?, "#{invalid_category.inspect} is invalid."
  end
end

controllers test

/test/controllers/에 위치한다. MVC 패턴의 C, V에 해당하는 테스트를 진행한다.

request handling test

controller가 수행하는 기능에 대한 테스트를 진행한다. get, post, patch, put, head, delete에 대해 진행할 수 있다.

setup do
  @post = posts(:one)
end

test "should get index" do
  get posts_url
  assert_response :success
end

test "should show post" do
  get post_url(@post)
  assert_response :success
end

test "should create post" do
  assert_difference('Post.count') do
    post posts_url, params: { post: { title: @post.title, description: @post.description, posted_at: @post.posted_at, category: @post.category }}
  end
  assert_redirect_to post_url(@post)
end

test "should update post" do
  patch posts_url(@post), params: { post: { title: @post.title, description: @post.description, posted_at: @post.posted_at, category: @post.category }}
  assert_redirected_to post_url(@post)
end

test "should destroy post" do
  assert_difference('Post.count', -1) do
    delete post_url(@post)
  end
  assert_redirected_to posts_url
end

routes test

Routing 테스트. routes 선언이 제대로 되어 있는지 확인한다.

test "should get home" do
  get root_url
  assert_response :success
end

test "should get about" do
  get about_url
  assert_response :success
end

views test

View에 대한 테스트도 /test/controllers/ 안에서 진행한다. assert_selector를 활용하여 여러 요소를 테스트할 수 있다.

test "should display home title"
  get root_path
  assert_select "title", "섭사장의 블로그"
end

test "should provide links" do
  get root_path
  assert_select "a[href=?]", root_path, count: 2
  assert_select "a[href=?]", about_path
end

helpers test

Ruby on Rails helper에 대한 테스트를 진행한다. Helper는 app/helpers에 있으며, 주로 application의 view에서 사용하는 module이다. helpers에 대한 테스트는 /test/helpers에 위치한다.

test "should return the full title" do
  assert_equal full_title("About"), "About | 섭사장의 블로그"
end

integration test

Integration test는 workflow를 테스트 한다. /test/integration에 위치한다. 아래 명령어를 통해 생성할 수 있다.

$ rails generate integration_test user_flows

앞에서 사용한 다양한 테스트들을 조합해 만들어 사용한다.

참고