【问题标题】:How do I test for an error with cucumber?如何测试黄瓜的错误?
【发布时间】:2013-11-18 20:16:58
【问题描述】:

我写了这个场景来测试当用户访问一个未发布的条目时,他们会看到一个错误页面:

Scenario: Unpublished entry
    Given there is an unpublished entry
    When a user visits the entry page
    Then he will see an error page

步骤

Given /^there is (?:an|one) unpublished entry$/ do
  @entry = create(:entry, published: false)
end

When /^a user visits the entry page$/ do
  visit entry_path(@entry)
end

Then(/^he will see an error page$/) do
  expect(response).to raise_error(ActiveRecord::RecordNotFound)
end

运行测试时,它不会通过第二步,因为它失败并出现ActiveRecord::RecordNotFound 错误;这是我想要的,但它发生在错误的步骤上。

When a user visits the entry page   # features/step_definitions/entry_steps.rb:17
  Couldn't find Entry with id=93 [WHERE "entries"."published" = 't'] (ActiveRecord::RecordNotFound)

显然我做错了什么。如何编写场景以更好地表达我的意图,即“访问未发布的条目会引发错误”?

【问题讨论】:

    标签: ruby-on-rails ruby testing cucumber


    【解决方案1】:

    如果您将 ActiveRecord::RecordNotFound 返回给用户,则您的 Web 应用程序存在问题。用户不应该看到 Rails 错误,因为它可能会给他们提供有关您服务器的敏感信息。而且它看起来很时髦!

    这是模式应该是什么:

    1. 用户请求无效项目
    2. Rails 尝试查找无效项目并抛出 ActiveRecord::RecordNotFound
    3. Rails 捕获 ActiveRecord::RecordNotFound 并将用户重定向到 404 页面。

    然后在 Cucumber 中,您将测试 404 页面。

    这是common HTML error codes 的列表,供您启迪。

    编辑

    这是捕捉ActiveRecord::RecordNotFound 错误的好方法。

    class SomeModel
      around_filter :catch_not_found
    
    private
      def catch_not_found
        yield
      rescue
         redirect_to not_found_url
      end
    end
    

    编辑 2

    您可能希望返回 403 Forbidden 而不是 404 Not Found

    编辑 3

    Here 详细讨论了为什么用 cucumber 捕获异常很奇怪。这是捕获和重定向的另一个论据。

    【讨论】:

    • 我不同意。他可能正在测试用户在地址栏中手动输入条目 ID 的可能性。在这里,用户正在滥用应用程序,开发人员没有责任保护他免受 404 的影响;他无能为力来防止这种情况发生。对于他(开发人员)而言,他希望确保未发布的文章不会通过手动输入 url 被暴露。
    • 在这种情况下它应该抛出一个 HTML 错误代码。 Web 应用程序永远不应该向世界公开异常。这就是为什么会有 HTML 错误代码!
    • 我倾向于同意,但在这种特殊情况下,用户可能是恶意的,我认为显示 Rails 生产错误屏幕并没有什么害处,除了有一个错误某种。加倍努力为正常使用时不应发生的错误提供错误处理对于不值得的接收者来说似乎是一项慷慨的承诺。
    • 我认为这也是一个品牌推广机会。返回标准错误页面看起来很俗气。相反,如果您返回 something more interesting and helpful,那么用户可能会留下来。返回基本错误页面会使用户远离您的网站,从而降低转化率。
    • 仔细想想,我觉得你是对的。这种类型的测试更适合控制器而不是黄瓜,后者旨在测试最终用户交互。 +1
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-23
    • 1970-01-01
    • 2014-07-24
    • 2016-10-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多