下面的代码是集成测试的一部分,它发出一个post
请求。
assert_no_difference 'User.count' do
post users_path, params: { user: {
name: '',
email: 'user@invalid',
password: 'foo',
password_confirmation: 'bar'
}}
end
但是,在运行测试时,我不断收到错误:
ArgumentError: wrong number of arguments (given 2, expected 1)
在检查堆栈跟踪时,我意识到此错误源于以下integration.rb
文件中的以下post
方法,该文件位于https://github.com/rails/rails/blob/8015c2c2cf5c8718449677570f372ceb01318a32/actionpack/lib/action_dispatch/testing/integration.rb
该方法定义为:
# Performs a POST request with the given parameters. See ActionDispatch::Integration::Session#process
# for more details.
def post(path,**args)
process(:post, path,**args)
end
如上所示,integration.rb
post
方法期望params
参数作为关键字参数,其中doublesplat运算符用于将关键字参数转换为哈希值。
post users_path, params: { user: {
name: '',
email: 'user@invalid',
password: 'foo',
password_confirmation: 'bar'
}}
它似乎被隐式地转换为散列,从而导致产生上述错误。
为了确认这一点,我将integration.rb
post
方法修改为:
# Performs a POST request with the given parameters. See ActionDispatch::Integration::Session#process
# for more details.
def post(path, args)
process(:post, path,**args)
end
在进行此更改后,代码将完美运行。
我的问题是我遗漏了什么?Rails是否执行了某种将params
关键字参数隐式转换为哈希的操作?
任何帮助都是非常感谢的。
1条答案
按热度按时间f4t66c6m1#
我已经解决了这个问题。
此问题源于未包含最新版本的
rails-controller-testing
gem。更新gem后,代码正常工作。