1

我在任何地方都找不到关于如何使用 Rack::Test 测试 Ruby/Sinatrapost方法成功地将数据保存到 YAML 存储/文件的基本解释。(解释了测试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 源码在这里

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

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

4

1 回答 1

0

没有人回答我的问题,既然我已经弄清楚答案是什么,我想我会在这里分享。

首先,我认为不需要检查数据是否实际保存到 YAML 存储中;主要是查看网页是否返回正确的结果(如果是,我们假设数据库是 groovy)。

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

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

这是更新的测试方法:

  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

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

于 2017-01-22T16:10:54.537 回答