2017-10-29 8 views
0

첫 번째 Rails 앱을 만들고 있습니다.Rails 컨트롤러에 문제가 있습니까? (통합?) 테스트

내 사용자 프로필에 사용자가 제목과 설명을 추가 할 수 있도록하고 싶습니다. 나는 그들에게 User 모델의 특성을 만들어 routes.rb이 추가 :

resources :users do 
    member do 
     post 'update_description' 
    end 
    end 

동일한 방법으로 (아직 작성) 두 속성을 모두 처리 할 것입니다. TDD를 연습하기 위해 사용자가 제목을 제출하면 컨트롤러가이를 데이터베이스에 저장한다는 테스트를 작성하려고했습니다. 나는 그것이 통합 테스트 일 것이라고 생각했지만, 나는 올바른 길을 얻을 수 없었다. (통합 테스트를해야합니까?)하지만 연구를 통해 관련 컨트롤러 테스트 파일에 작동하는 post 문을 작성했습니다.

test "profile submits new title and description successfully" do 
    log_in_as(@user) 
    get :show, id: @user 
    assert_nil @user.title 
    post :update_description, id: @user, params: { title: "Lorem ipsum" } 
    # Next: 
    # @admin.reload.title 
    # assert @admin.title == "Lorem ipsum" 
    # assert_template 'users/show' 
    # Etc. 

    end 

이 다음과 같은 오류 발생합니다 : 다음은 컨트롤러 테스트의 난이 레일은보기 파일을 찾고 하나를 찾을 수없는 의미 수집

ERROR["test_profile_submits_new_title_and_description_successfully", UsersControllerTest, 2017-10-22 21:42:52 -0400] 
test_profile_submits_new_title_and_description_successfully#UsersControllerTest (1508722972.17s) 
ActionView::MissingTemplate:   ActionView::MissingTemplate: Missing template users/update_description, application/update_description with {:locale=>[:en], :formats=>[:html], :variants=>[], :handlers=>[:erb, :builder, :raw, :ruby, :coffee, :jbuilder]}. Searched in: 
      * "/var/lib/gems/2.3.0/gems/web-console-2.0.0.beta3/lib/action_dispatch/templates" 
      * "/home/globewalldesk/startthis/app/views" 
      * "/var/lib/gems/2.3.0/gems/web-console-2.0.0.beta3/app/views" 

      test/controllers/users_controller_test.rb:83:in `block in <class:UsersControllerTest>' 
     test/controllers/users_controller_test.rb:83:in `block in <class:UsersControllerTest>' 

은,하지만 난 볼 수 없습니다 왜 post :update_description보기를 찾고있다 ... 나는 그것이보기없이 정보를 게시 할 것이라고 생각했다 (나는보기가없는 동일한 방식으로 작동하는 비슷한 경로를 가지고있다). update_description 방법은 Users 컨트롤러에 있습니다. 나는 많은 연구를했지만, 내가 뭘 잘못하고 있는지 알 수 없다. 도움! TIA.

답변

1

테스트 작성 방법은 통합 테스트로 보입니다. 하지만 필자는 개인적으로 시스템 테스트를 작성하는 데 조언을 구할 것입니다. 사용자 개체를 업데이트하기 위해 update_description 회원 경로를 만들었습니까? 그럴 필요는 없습니다. 귀하의 User 리소스에는 이미 editupdate 개의 작업이 있으므로 해당 회원 경로를 삭제할 수 있습니다.

워크 플로를 확인하고 앱의 다른 부분을 상호 작용하는 데 사용되는 통합 테스트입니다. 시스템 검사는 사용자 상호 작용을위한 것이지만 기본적으로 사용자가 수행하고 브라우저에서 볼 수있는 사항을 확인합니다. 또한이 기술에서 테스트를 작성하는 것이 훨씬 간단합니다 (최소한이 레벨에서).

setup do 
    log_in_as(@user) // or what ever code to visit login page and login user 
end 

test "profile submits new title successfully" do 
    visit edit_user_path 

    fill_in "Title", with: "Lorem ipsum" 

    click_on "Save" 

    assert_response :redirect 
    follow_redirect! 
    assert_select "Title", text: "Lorem ipsum" 
end 

이것은 사용자가 자신의 양식을 제출 한 후, 응용 프로그램이 user_path(@user) (쇼 페이지)로 리디렉션 있다고 가정처럼

그래서 시스템 테스트가 보일 것이다.

및 통합 시험과 같이 보일 것이다 :

test "profile submits new title successfully" do 
    log_in_as(@user) // or what ever code to login user 
    get "/user/#{@user.id}/edit" 
    assert_response :success 

    updated_title = "Lorem ipsum" 

    patch :update, user: { id: @user.id, title: updated_title } 

    assert_response :redirect 
    follow_redirect! 
    assert_response :success 
    assert_select "Title", text: "Lorem ipsum" 
end 

참고 -이 테스트를하지 않은 나는 카피 바라 및 기타 도구가 아니라 Minitest를 사용합니다. 하지만이 간단한이 내 생각을 작동합니다.

그리고 확인 docs 아직 ..

+0

와우, 내가 자바 스크립트 테스트를하는 것에 대해 많은에게 온라인 지난 며칠를 찾는 것을 다 havent 한 경우. 제가 들었던 테스트 프레임 워크 중 하나는 Capybara였습니다. 링크 된 Rails Guides 페이지에서 "시스템 테스트는 Capybara를 기본으로 사용합니다."라고 말합니다. 레일즈 4.2.2가 실제로 사용되는지 알고 있습니까? 어쨌든 최소한 통합 테스트를 위해 솔루션을 시험해 보겠습니다. 시스템 테스트는 곧 배우게 될 또 다른 것 같습니다. 감사! – globewalldesk

+0

그래서,'Users # edit'에 의존하는 대신에'update_description' 라우트를 만들게 된 문제가 있습니다.사용자 편집 페이지 ('users//edit'에 있습니다)는 이름과 패스워드를 가지고 있습니다. 프로필 페이지는'users/'에 있습니다. 사용자가 제목, 설명 및 메시지 수신과 같은 프로필 유형 정보를 추가 할 수 있도록하고 싶습니다. 그래서 나는 그것들이'User' 속성이라는 것을 알았습니까? 하지만 이미 사용자 이름과 암호 정보를 처리하는'edit' 액션이 있습니다. 따라서 사용자 정보 수정을 처리하기위한 새로운 경로를 만들겠습니다. 더 좋은 솔루션이 있습니까? – globewalldesk

+0

도움에 감사드립니다. 두 가지가 잘못되었습니다. 첫째, 통합 테스트에서 나는 잘못된'post' 라인을 사용하고있었습니다. 이 작업 방식 : 'post "/users/#{@non_admin.id}/update_description", params : {title : "나는 끊임없는 슬픔의 사람입니다." }' 그리고 다른 문제는'Users # update_description' 액션이 _some_ 뷰의 뷰를로드해야한다는 것입니다. (아직 메소드를 작성하지 않았습니다!). 나는'redirect_to user_path (@user)'를 추가하기 만하면되었다. – globewalldesk