我可以测试Sinatra post方法是否成功保存到YAML商店?

我无法在Rack :: Test的任何地方找到关于如何测试的基本解释,即Ruby / Sinatra post方法成功地将数据保存到YAML存储/文件。 (这解释了测试get ,我可以做(!),但不能post ;其他提到的使用机架/测试测试post方法的提法似乎不相关。)对于自学,我正在构建一个“待办事宜” 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的来源在这里

如果你可以在一本书(章节,网站,博客等)上给我建议,以一种相对初学者可以访问的方式进行,我将非常感激。

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


没有人回答我的问题,因为我已经知道答案是什么,所以我想我会在这里分享它。

首先,我认为应该不需要检查数据是否实际保存到YAML商店; 最主要的是看网页是否返回正确的结果(如果是的话,我们假设数据库是常规的)。

我上面写的测试方法是正确的; 它只是缺少单行follow_redirect! 。 显然,我没有意识到我需要指示耙/测试来遵循重定向。

部分问题是我根本没有找到正确的文档。 本页确实给出了正确的语法,但没有提供太多细节。 这个页面帮助了很多,这一点涵盖了重定向。

以下是更新的测试方法:

  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

(感谢哥伦布红宝石旅。)

链接地址: http://www.djcxy.com/p/45633.html

上一篇: Can I test that a Sinatra post method successfully saves to a YAML store?

下一篇: How to send external form POST data through AJAX