Ruby on rails Rails功能测试用例和将文件上载到ActionDispatch::Http::UploadFile
我正在向远程存储文件的Rails应用程序添加测试。我正在使用默认的Rails功能测试。我如何向它们添加文件上载?我有:Ruby on rails Rails功能测试用例和将文件上载到ActionDispatch::Http::UploadFile,ruby-on-rails,ruby,gem,functional-testing,Ruby On Rails,Ruby,Gem,Functional Testing,我正在向远程存储文件的Rails应用程序添加测试。我正在使用默认的Rails功能测试。我如何向它们添加文件上载?我有: test "create valid person" do post(:create, :person => { :avatar => fixture_file_upload('avatar.jpeg') }) end 出于某种原因,这会上载Tempfile,并导致AWS/S3gem失败,原因如下: NoMethodError: undefined metho
test "create valid person" do
post(:create, :person => { :avatar => fixture_file_upload('avatar.jpeg') })
end
出于某种原因,这会上载Tempfile
,并导致AWS/S3
gem失败,原因如下:
NoMethodError: undefined method `bytesize' for Tempfile
我是否可以通过他们的方法让测试使用ActionDispatch::Http::UploadedFile
,并像使用web浏览器测试时那样执行测试?fixture\u file\u upload
是测试上传文件到控制器的方法吗?如果是这样,为什么它不像浏览器那样工作
请注意,我真的不想切换测试框架。谢谢 我建议使用mock。
谷歌快速搜索显示:
您应该能够创建一个对象,该对象将响应您希望它响应的行为。主要用于单元测试环境中,因此您可以单独测试您的内容,因为集成测试应该充分利用整个堆栈。然而,我可以看出,在这种情况下,模拟S3服务是很有用的,因为它需要花费金钱。我不熟悉AWS/S3 gem,但您可能没有正确使用:avatar参数<代码>字节大小在ruby1.9中的
字符串
上定义。如果对上传的文件调用read
并将其传递到AWS/S3,会发生什么情况?我使用而不是AWS/S3 gem。其主要原因是不支持欧洲的Bucket,aws/s3的开发似乎已经停止
如果要测试文件上载,则使用fixtures\u file\u upload方法是正确的,它将直接映射到Rack::test::UploadedFile.new(如果测试文件不在fixtures文件夹中,则可以使用此方法)
但我也注意到,Rack::Test::Uploaded file对象的行为与ActionDispatch::Http::UploadedFile对象(上传文件的类别)并不完全相同。基本方法(原始文件名、读取、大小等)都可以使用,但使用文件方法时存在一些差异。所以,把你的控制器限制在这些方法上,一切都会好起来的
另一种可能的解决方案是创建ActionDispatch::Http::Upload file对象,并使用该对象:
upload = ActionDispatch::Http::UploadedFile.new({
:filename => 'avatar.jpeg',
:type => 'image/jpeg',
:tempfile => File.new("#{Rails.root}/test/fixtures/avatar.jpeg")
})
post :create, :person => { :avatar => upload }
感谢您的回复,但如果可能的话,我真的希望继续使用普通的功能测试!我很乐意支付微费用来测试S3服务(因为它是核心),我不认为这是问题所在。在浏览器中测试时,我的代码工作正常。我只需要添加对自动测试的支持,并希望测试使用
ActionDispatch::Http::UploadedFile
(响应tempfile
,允许访问磁盘上的文件),这样我就可以集成了。很抱歉延迟,但这看起来很完美!非常感谢你的回答+1,使用ActionDispatch::Http::UploadedFile更安全,因为Rack::Test::Uploaded与Rails的API不兼容。属性为content\u type
,但需要将key:type传递到初始值设定项中。()upload
出现在paramsI中的“#”
字符串与@sohair有相同的问题。这个解决方案不起作用,文件只是以他提到的格式作为字符串到达控制器。