如何在Capybara验收测试中存根控制器/ current_user方法

Eri*_* M. 2 testing rspec capybara ruby-on-rails-3

我有一个调用current_user.eligible_for_reward的辅助方法?我希望在Capybara验收规范中存根.在我的模型中,我有一个占位符虚拟方法:

User.rb

def eligible_for_reward?
  "blah"
end
Run Code Online (Sandbox Code Playgroud)

这是我到目前为止所尝试的:

  1. 我试过stubing current_user,但这会导致"修改冻结对象"错误,因为控制器是零.我相信只有在我使用RSpec的get而不是访问some_path时才会设置控制器.我需要坚持访问some_path,我相信,否则我的page.should ...都会失败,因为页面没有设置.

  2. 我尝试以用户身份登录(login_as(用户)成功运行注册/登录)然后将user.eligible_for_reward?存根,但这似乎不起作用,因为我仍然回到测试"blah"

是否有一种很好的方法来隐藏这种方法?

sol*_*nic 7

接受规格的确定不是一个好主意.如果没有其他办法,那么你可以这样做:

User.any_instance.stub!(:eligible_for_reward?).and_return(true)
Run Code Online (Sandbox Code Playgroud)

请记住,验收规范中的存根/嘲弄意味着你真的不测试任何东西.

  • 这是一个很好的经验法则,但说"你没有测试任何东西"有点教条.在验收测试中存根的一个好处是使用复杂的外部服务.在这些情况下,您不希望设置测试上下文以匹配测试服务的杂项.我使用的一种方法是使用特殊格式的工厂将测试与复杂的API隔离,并使用较低级别的套件彻底测试API,并在我的代码中制作一个薄的,易于删除的垫片,以便将接受中潜在错误的表面区域最小化. (12认同)