在 rspec 请求规范中,如何测试 URL 中使用非 ascii 字符调用的端点的实际行为?

问题描述 投票:0回答:1

为调用具有非 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 阻止了,而且似乎并没有不管怎样,都喜欢好的测试代码..

ruby-on-rails rspec-rails
1个回答
0
投票

这是默认的

Rails
测试助手的工作方式:他们假设 URL 是有效的(已经转义)。

rspec-rails
rack-test
中有很多关于它的问题。例子: https://github.com/rspec/rspec-rails/issues/2494

为了在测试中重现浏览器(或curl / postman)行为 - 确保所有

non-ascii
符号都被转义:
CGI.escape('あ')

© www.soinside.com 2019 - 2024. All rights reserved.