测试 rspec 和 capybara 的 cookies 是不同的

bjtugun · 2014年05月15日 · 最后由 bjtugun 回复于 2014年05月15日 · 2512 次阅读

其他人遇到的相同问题: http://ruby-china.org/topics/13913 @RainFlying http://ruby-china.org/topics/12411 @diguage

在学习 Ruby on Rails Tutorial 的例子中,有一段测试混合了 rspec 和 capybara。 rails 4, capybara 2.2.1, rspec 2.14.1

before do
  visit signin_path  #访问登陆页面
  click_button 'Sign In'  #登陆,服务端设置cookie
  patch user_path(wrong_user) #试图修改其他玩家的信息
  response.should redirect_to(root_url)   #服务端重定向到root
end

多次测试下来,总是重定向到 signin_path。我也纠结了一天,最终查看 log/test.log,看到patch时的cookie和登陆后的是不一样的,接下来的多次google和随便尝试,发现rspec和capybara并不共用一套cookie instance。

测试通过的方法:

#设置patch方法所依赖的cookies对象
cookies[:remember_token] = page.driver.request.cookies['remember_token'] 
patch user_path(wrong_user)

正常来说根本不会有问题,完全不需要 hack。之所以出问题是因为你的做法不规范,测机器的和测人的混在了一起。

既然用了 Capybara,就要测试用户的行为而不是系统的行为。难道用户自己会patch? 只有机器才会。难道正常用户可以看到 response? 他只知道跳转到了什么页面。

单就你这一个测试来看,如果要测试#patch, 不必要用 Capybara,而应该用 controller spec, Rspec 或者 Minitest 都可,测试 redirect。因为你并没有给用户提供修改其他用户的 UI. 所以 capybara 没法测。

#1 楼 @billy 额,先别着急喷。我只是按照教程来做的,教程http://railstutorial-china.org/ 教程中的例子我无法正确执行,所以就 hack 一下。

我同意你的看法,要区分测试用户行为还是测试系统行为。 对于恶意攻击的情形,未授权的 patch 要补充测试的,当然应该放在 controller spec,而不是 request/feature spec 中。只是教程目前是这个样子

需要 登录 后方可回复, 如果你还没有账号请 注册新账号