我有一个典型的Rails模型表单,它带有一个允许多个附件的文件附件选择器。它在开发中运行良好,但在系统测试期间,会引发ActiveSupport::MessageVerifier::InvalidSignature
异常。
- 轨道7.0.2.2
- 水豚3.36.0
- 机架测试1.1.0
模型has_many_attached :photos
。
该表单使用form_with
和multipart: true
。
HTML源代码看起来是正确的。
在开发过程中,手动使用带有0或任何文件附件的表单可以正常工作。
在系统测试中,我使用的是rack_test
驱动程序。
test "creating a quote request" do
visit new_quote_request_path
fill_in "First name", with: 'FAKE FIRST'
# ...
click_on "Submit"
assert_text "Success"
end
在控制器中,我的规范参数允许方法看起来像:
def quote_request_params
params.require(:quote_request).permit(:first_name, :last_name, :email,
:phone_number, :shipping, :promo_code, :description, :item_type_id, :brand_id,
photos: [])
end
我的控制器create
方法是典型的。。。
def create
@quote_request = QuoteRequest.new(quote_request_params)
respond_to do |format|
# ...
在系统测试中,QuoteRequest.new(quote_request_params)
的调用会引发ActiveSupport::MessageVerifier::InvalidSignature
异常。
有了断点,我可以看到quote_request_params
看起来像:
#<ActionController::Parameters {"first_name"=>"FAKE FIRST",
"last_name"=>"FAKE LAST", "email"=>"fake@fake.com",
"phone_number"=>"5415555555", "shipping"=>"1", "promo_code"=>"",
"description"=>"Fake quote request description.",
"item_type_id"=>"980190962", "brand_id"=>"980190962",
"photos"=>[
"",
"#<Capybara::RackTest::Form::NilUploadedFile:0x000000010dae35b8>"
]} permitted: true>
Capybara似乎在做它的默认行为,为多部分表单附加一个"nil文件">
为什么测试会引发ActiveSupport::MessageVerifier::InvalidSignature
异常?
这是Rails 7和机架测试的一个问题。可以通过在config/environments/test.rb
中放入以下内容暂时解决:
config.active_storage.multiple_file_field_include_hidden = false
有关更多详细信息,请参阅机架测试问题。