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

我无法在任何地方找到关于如何使用Rack :: Test测试Ruby / Sinatra post方法成功将数据保存到YAML存储/文件的基本解释。 ( 这解释了测试get ,我可以做(!),但没有post ;其他提到测试使用rack / test的post方法似乎无关紧要。)对于自学,我正在构建一个“待办事项”应用程序在Ruby / Sinatra和我正在尝试使用TDD的一切,并像一个好小男孩一样进行unit testing。 我的要求是:当用户发布新任务时,它将保存在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商店; 主要的是看网页是否返回正确的结果(我们假设数据库是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 

(感谢Columbus Ruby Brigade。)