2016-12-24 13 views
1

Ruby/Sinatra postメソッドがYAMLストア/ファイルにデータを正常に保存することを、Rack :: Testでどのようにテストできるかについて、どこからでも基本的な説明を見つけることができません。 (Thisgetのテストを説明していますが、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 

...私がテストしたい1つの応答はスラッシュルート上に実際にあります、 /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ストアに保存されているかどうかを確認する必要はありません。主なものは、Webページが正しい結果を返すかどうかを確認することです(データベースが正しくないと判断した場合、その結果は正しいと見なします)。

上記のテスト方法は正しいです。それは単に単線を逃していた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 

関連する問題