我可以测试Sinatra POST方法是否成功保存到YAML商店吗? [英] Can I test that a Sinatra post method successfully saves to a YAML store?

查看:30
本文介绍了我可以测试Sinatra POST方法是否成功保存到YAML商店吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在任何地方都找不到关于如何使用Rack::Test测试Ruby/Sinatrapost方法成功地将数据保存到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

Github source here

如果您能就一本书(章节、网站、博客等)给我建议如果能以相对初学者可以理解的方式讲完这一点,我将不胜感激。

温柔点……我对测试(和编程)非常陌生。

推荐答案

没有人回答我的问题,既然我已经知道答案是什么,我想我应该在这里分享它。

首先,我认为应该没有必要检查数据是否真的保存到了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

(感谢哥伦布红宝石旅)

这篇关于我可以测试Sinatra POST方法是否成功保存到YAML商店吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆