Ruby on rails 3 如何在Capybara验收测试中存根控制器/当前用户方法

Ruby on rails 3 如何在Capybara验收测试中存根控制器/当前用户方法,ruby-on-rails-3,testing,rspec,capybara,Ruby On Rails 3,Testing,Rspec,Capybara,我有一个助手方法,可以调用当前的\u用户。是否有资格获得\u奖励?我想在水豚验收规范中存根该调用。在我的模型中,我有一个占位符伪方法: User.rb def eligible_for_reward? "blah" end 以下是我到目前为止所做的尝试: 我试着截取当前用户,但这会导致“修改冻结对象”错误,因为控制器为零。我相信只有当我使用RSpec的get而不是访问某个路径时,才会设置控制器。我需要坚持访问一些路径,我相信,否则我的页面应该。。。由于未设置页面,所有操作均失败 我尝试以

我有一个助手方法,可以调用当前的\u用户。是否有资格获得\u奖励?我想在水豚验收规范中存根该调用。在我的模型中,我有一个占位符伪方法:

User.rb

def eligible_for_reward?
  "blah"
end
以下是我到目前为止所做的尝试:

  • 我试着截取当前用户,但这会导致“修改冻结对象”错误,因为控制器为零。我相信只有当我使用RSpec的get而不是访问某个路径时,才会设置控制器。我需要坚持访问一些路径,我相信,否则我的页面应该。。。由于未设置页面,所有操作均失败

  • 我尝试以用户身份登录(登录为(用户),它成功地通过注册/登录运行),然后删除用户。有资格获得奖励吗?但这似乎不起作用,因为我仍然得到测试“废话”


  • 有没有一个好方法可以去掉这个方法

    在验收规范中存根不是一个好主意。如果没有其他方法,您可以:

    User.any_instance.stub!(:eligible_for_reward?).and_return(true)
    

    请记住,在验收规范中存根/模拟东西意味着您实际上不需要测试任何东西。

    我采用了不同的方法。我同意斯塔宾不是这里最好的。谢谢。请注意,完全集成测试并不是水豚的唯一用途。在test::Unit、RSpec或MiniTest中使用Capybara/Selenium测试Javascript功能是完全合理的,并在Rails中删除任何可以使其尽可能快地运行的内容。另外,在剔除Desive时,我更愿意对它进行更彻底的了解,并且存根:authenticate\u user!不执行任何操作,并存根控制器的#当前#用户以返回假用户实例。那样的话,Desive就完全不存在了。请注意
    存根应替换为
    存根
    <代码>存根
    是该方法的旧且不正确的别名。参见的最后三段。这是一条很好的经验法则,但说“你什么都不测试”有点教条。在验收测试中存根是一个好主意的地方是复杂的外部服务。在这些情况下,您不希望设置测试上下文来匹配测试服务的附带内容。我使用的一种方法是使用特殊格式的工厂隔离针对复杂API的测试,并使用较低级别套件彻底测试API,并在我的代码中制作一个薄的、容易存根的垫片,以便将验收中潜在错误的表面积降到最低。