2016-12-24 78 views
1

我無法在Rack :: Test的任何地方找到關於如何測試的基本解釋,即Ruby/Sinatra post方法成功地將數據保存到YAML存儲/文件。 (This解釋測試get,我可以做(!),但不是post;其他提及測試post與機架/測試方法似乎不相關。)爲自學,我建立一個「做」應用程序在Ruby/Sinatra和我正在嘗試使用TDD的一切和單元測試,就像一個好孩子。我的要求是:當用戶發佈新任務時,它會保存在YML商店中。我可以測試Sinatra post方法是否成功保存到YAML商店?

我正在考慮通過查看「任務已保存」是否顯示在對用戶的響應中進行測試(當然這不是直接測試這個東西本身......但是我也會這麼做喜歡測試):

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

或者通過某種方式測試一個測試任務的描述現在在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!。顯然,我沒有意識到我需要指示耙/測試來遵循重定向。

問題的一部分是我根本沒有找到正確的文檔。 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 

相關問題