我可以测试 Sinatra post 方法是否成功保存到 YAML 存储?
Can I test that a Sinatra post method successfully saves to a YAML store?
我在任何地方都找不到关于如何使用 Rack::Test 进行测试的基本解释,Ruby/Sinatra post
方法成功地将数据保存到 YAML store/file. (This 解释了测试 get
,我可以做(!),但 post
不行;其他提到用 rack/test 测试 post
方法似乎无关紧要。)对于 self-study,我正在 Ruby/Sinatra 中构建一个 "to do" 应用程序,并且我正在尝试使用 TDD 一切并像一个好孩子一样进行单元测试。我有一个需求是:当用户发布一个新任务时,它被保存在YML商店中。
我正在考虑通过查看是否在对用户的响应中显示 "Task saved" 来测试它(这当然不是直接测试事物本身......但我会这样做也喜欢测试):
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
如果您能以适合初学者的方式介绍本书(章节、网站、博客等)给我建议,我将不胜感激。
温柔一点...我对测试(和编程)还很陌生。
没有人回答我的问题,既然我知道答案是什么,我想我会在这里分享它。
首先,我认为没有必要检查数据是否真的保存到 YAML 存储中;主要是看网页returns结果是否正确(我们假设数据库是groovy如果是)。
我上面写的测试方法是正确的;它只是缺少一行 follow_redirect!
。显然我没有意识到我需要指示 rake/test 跟随重定向。
部分问题是我没有找到正确的文档。 This page does give the correct syntax, but doesn't give much detail. This page helped a lot, and 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
(感谢哥伦布Ruby旅。)
我在任何地方都找不到关于如何使用 Rack::Test 进行测试的基本解释,Ruby/Sinatra post
方法成功地将数据保存到 YAML store/file. (This 解释了测试 get
,我可以做(!),但 post
不行;其他提到用 rack/test 测试 post
方法似乎无关紧要。)对于 self-study,我正在 Ruby/Sinatra 中构建一个 "to do" 应用程序,并且我正在尝试使用 TDD 一切并像一个好孩子一样进行单元测试。我有一个需求是:当用户发布一个新任务时,它被保存在YML商店中。
我正在考虑通过查看是否在对用户的响应中显示 "Task saved" 来测试它(这当然不是直接测试事物本身......但我会这样做也喜欢测试):
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
如果您能以适合初学者的方式介绍本书(章节、网站、博客等)给我建议,我将不胜感激。
温柔一点...我对测试(和编程)还很陌生。
没有人回答我的问题,既然我知道答案是什么,我想我会在这里分享它。
首先,我认为没有必要检查数据是否真的保存到 YAML 存储中;主要是看网页returns结果是否正确(我们假设数据库是groovy如果是)。
我上面写的测试方法是正确的;它只是缺少一行 follow_redirect!
。显然我没有意识到我需要指示 rake/test 跟随重定向。
部分问题是我没有找到正确的文档。 This page does give the correct syntax, but doesn't give much detail. This page helped a lot, and 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
(感谢哥伦布Ruby旅。)