我无法在任何地方找到关于如何使用Rack :: Test测试Ruby / Sinatra post
方法成功将数据保存到YAML存储/文件的基本解释。 (This解释了测试get
,我可以做(!),但不是post
;其他提及测试post
方法与机架/测试似乎无关紧要。)对于自我 - 我正在建立一个"做" Ruby / Sinatra中的应用程序,我尝试使用TDD所有内容并像一个好小男孩一样进行单元测试。我的要求是:当用户发布新任务时,它将保存在YML商店中。
我正在考虑通过查看"任务是否已保存"来测试此问题。在对用户的回复中显示(当然这不是直接测试事物本身......但是我还 喜欢测试):
assert last_response.body.include?("Task saved")
或通过某种方式测试测试任务的描述现在是否在YML文件中。我想我可以打开YML文件并查看,然后从YML文件中删除它,但我很确定这不是我应该做的。
我确认post
确实正确保存到YML文件:
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
如果您能以相对初学者可以访问的方式向我提供有关本书(章节,网站,博客等)的建议,我将非常感激。
要温柔......我对测试(和编程)非常陌生。
答案 0 :(得分:0)
没有人回答我的问题,因为我已经弄明白答案是什么,我想我会在这里分享。
首先,我认为没有必要检查数据是否实际保存到YAML商店;主要的是看网页是否返回正确的结果(我们假设数据库是groovy,如果是这样)。
我上面写的测试方法是正确的;它只是缺少单行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
(感谢Columbus Ruby Brigade。)