为调用具有非 ascii 字符的端点的 rspec 编写测试时,测试会抛出 InvalidURIError - 这是预期的,因为非 ascii 字符在 URI 中无效。
然而,在邮递员或卷曲中发出的相同请求会产生 ActiveController::RouterError。
# Assuming a controller called BooksController with a show action that takes :book_id as a parameter
describe BooksController do
describe 'GET #show' do
get :show, id: 'あ' # Will throw InvalidURIError - making the same request via curl or postman will produce 404 ActiveController::RouterError
end
end
这种差异是因为 rspec 在某些时候使用 URI 库来解析预期的 url。但这意味着在测试任何实际代码之前会抛出错误 - 使其成为无用的测试 - 然而返回 404/RouterError 的行为仍然是我想要测试和记录的行为。
这里有哪些选项?其他人以前遇到过这个吗?有没有办法编写此测试,使其不使用 URI?这是个好主意吗?
对于测试,我将其包装在一个块中,该块将
Rails.application.env_config
更改为具有值 action_dispatch.show_exceptions
true 和 action_dispatch.show_detailed_exceptions
false - 但此错误继续发生,这导致我更详细地检查堆栈跟踪并意识到这一点发生在测试本身中,而不是应用程序逻辑中的实际代码。
但我实际上已经陷入了死胡同,倾向于认为这不是可以在 rspec 中测试的东西。我觉得应该有一种方法可以在较低的级别上对此进行测试,我什至尝试使用
net/https
尽管我遇到了这样的问题:这发出了实际的网络请求,因此被 webmock 阻止了,而且似乎并没有不管怎样,都喜欢好的测试代码..
这是默认的
Rails
测试助手的工作方式:他们假设 URL 是有效的(已经转义)。
rspec-rails
和rack-test
中有很多关于它的问题。例子:
https://github.com/rspec/rspec-rails/issues/2494
为了在测试中重现浏览器(或curl / postman)行为 - 确保所有
non-ascii
符号都被转义:CGI.escape('あ')
。