gpt4 book ai didi

ruby-on-rails - 如何测试 cucumber 的错误?

转载 作者:行者123 更新时间:2023-11-28 21:12:12 26 4
gpt4 key购买 nike

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

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)

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

最佳答案

如果您将 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 捕获异常很奇怪。这是捕获和重定向的另一个论据。

关于ruby-on-rails - 如何测试 cucumber 的错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20057010/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com