2016-12-24 6 views
1

Ruby/Sinatra post 메서드가 데이터를 YAML 저장소/파일에 성공적으로 저장한다는 것을 Rack :: Test에서 어떻게 테스트 할 수 있는지에 관한 기본적인 설명을 찾을 수 없습니다. (This은 내가 할 수있는 테스트 get을 설명하지만, post이 아닌 다른 테스트는 랙/테스트와 함께 post 방법과는 무관합니다.) 자습을 위해 Ruby/Sinatra와 나는 좋은 어린 아이처럼 TDD 모든것과 단위 테스트를 사용하려고합니다. 요구 사항은 다음과 같습니다. 사용자가 새 작업을 게시하면 YML 저장소에 저장됩니다.Sinatra 게시 방법이 YAML 상점에 성공적으로 저장되었는지 테스트 할 수 있습니까?

"작업 저장 됨"이 사용자에게 응답으로 표시되는지 (물론 직접 테스트하지는 않지만 ...) 내가 이걸 시험해 볼 생각이었습니다 ...하지만 도 있습니다.) 테스트 할 :

assert last_response.body.include?("Task saved")

또는 어떻게 든 테스트 작업의 설명이 YML 파일에 있는지 검사하여합니다. 나는 YML 파일을 열어서보고, YML 파일에서 삭제할 수 있다고 생각하지만, 나는 그것이 내가해야 할 일이 아니라고 확신한다.

내가 올바르게 YML 파일에 저장 않습니다 post을 확인했습니다 : 당신이 볼 수 있듯이,이 리디렉션에 종료

get('/') do |*user_message| 
    # prepare erb messages 
    @user_message = session[:message] if session[:message] 
    @overlong_description = session[:overlong_description] if 
    session[:overlong_description] 
    session[:message] = nil # clear message after being used 
    session[:overlong_description] = nil # ditto 
    @tasks = store.all 
    erb :index #, user_message => {:user_message => params[:user_message]} 
end 

post('/newtask') do 
    @task = Task.new(store, params) 
    # decide whether to save & prepare user messages 
    if @task.complete == true # task is complete! 
    @task.message << " " + "Task saved!" 
    session[:message] = @task.message # use session[:message] for user messages 
    @task.message = "" 
    store.save(@task) 
    else 
    @task.message << " " + "Not saved." # task incomplete 
    session[:message] = @task.message # use session[:message] for user messages 
    session[:overlong_description] = @task.overlong_description if 
     @task.overlong_description 
    @task.message = "" 
    @task.overlong_description = nil 
    end 
    redirect '/' 
end 

... 내가 테스트 할 하나 개의 응답이 슬래시 노선에 실제로, /newtask 경로가 아닙니다.

그래서 물론 테스트가 작동하지 않습니다

def test_post_newtask 
    post('/newtask', params = {"description"=>"Test task 123"}) 
    # Test that "saved" message for user is in returned page 
    assert last_response.body.include?("Task saved") # boooo 
    end 

Github source here

당신이 넘어 책 (장, 웹 사이트, 블로그 등)에 나에게 조언을 줄 수있는 경우 상대적 초보자가 접근 할 수있는 방법, 나는 가장 감사 할 것입니다.

친절하게 ... 나는 테스트 (프로그래밍)에 매우 익숙합니다.

답변

0

아무도 내 질문에 대답하지 못했고 대답이 무엇인지 알아 냈으므로 여기에서 공유 할 것이라고 생각했습니다.

우선 데이터가 실제로 YAML 상점에 저장되었는지 확인할 필요가 없습니다. 가장 중요한 것은 웹 페이지가 올바른 결과를 반환하는지 확인하는 것입니다 (우리는 데이터베이스가 멋지다 고 가정합니다).

위의 테스트 방법은 정확합니다. 단 하나의 라인이 누락되었습니다. follow_redirect!. 분명히 나는 ​​리다이렉트를 따르기 위해 rake/test를 지시 할 필요가 있다는 것을 깨닫지 못했다.

문제의 일부는 올바른 문서를 찾지 못했기 때문입니다. This page은 정확한 구문을 제공하지만 자세한 내용은 제공하지 않습니다. This page이 많은 도움을 주었고 this bit covers redirects. 여기

업데이트 된 시험 방법은 다음과 같습니다. (콜럼버스 루비 여단 덕분으로)

def test_post_newtask 
    post "/newtask", params = {"description" => "Write about quick brown foxes", 
     "categories" => "writing823"} 
    follow_redirect! 
    assert last_response.body.include?("Task saved") 
    assert last_response.body.include?("Write about quick brown foxes") 
    end