【问题标题】:How can I stub a controller/current_user method in Capybara acceptance test如何在 Capybara 验收测试中存根控制器/current_user 方法
【发布时间】:2014-03-11 16:08:41
【问题描述】:

我有一个调用 current_user.eligible_for_reward 的辅助方法?我想在 Capybara 接受规范中存根该调用。在我的模型中,我有一个占位符虚拟方法:

User.rb

def eligible_for_reward?
  "blah"
end

这是我迄今为止尝试过的:

  1. 我尝试存根 current_user,但由于控制器为 nil,因此导致“修改冻结对象”错误。我相信只有当我使用 RSpec 的 get 而不是访问 some_path 时才会设置控制器。我相信我需要坚持访问 some_path,否则我的 page.should ... 都会失败,因为没有设置页面。

  2. 我尝试以用户身份登录 (login_as(user) 成功通过注册/登录),然后存根 user.eligible_for_reward?,但这似乎不起作用,因为我还在回来测试“等等”

有没有一种好方法来存根这个方法?

【问题讨论】:

    标签: ruby-on-rails-3 testing rspec capybara


    【解决方案1】:

    在验收规范中存根不是一个好主意。如果没有其他办法,那么你可以这样做:

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

    请记住,验收规范中的存根/模拟意味着您真的不测试任何东西。

    【讨论】:

    • 我采取了不同的方法。同意存根不是最好的。谢谢。
    • 请注意,完全集成测试并不是 Capybara 的唯一用途。在 Test::Unit、RSpec 或 MiniTest 中使用 Capybara/Selenium 测试 Javascript 功能是完全合理的,并在 Rails 中尽可能快地运行任何其他内容。此外,在对 Devise 进行 stub 时,我更愿意对其进行更彻底的处理,并且 stub :authenticate_user!什么都不做,并存根控制器的#current_user 以返回一个假的用户实例。这样一来,Devise 就完全不在了。
    • 请注意stub! 应替换为stubstub! 是该方法的旧且不正确的别名。请参阅this email 的最后三段。
    • 这是一个很好的经验法则,但说“你不测试任何东西”有点教条。在验收测试中存根是一个好主意的一个地方是复杂的外部服务。在这些情况下,您不希望设置测试上下文以匹配测试服务的附带条件。我使用的一种方法是使用特殊格式的工厂将测试与复杂的 API 隔离开来,并使用较低级别的套件彻底测试 API,并在我的代码中制作一个薄的、易于存根的 shim,从而最大限度地减少接受中潜在错误的表面积.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多