Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/54.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails功能测试用例和将文件上载到ActionDispatch::Http::UploadFile_Ruby On Rails_Ruby_Gem_Functional Testing - Fatal编程技术网

Ruby on rails Rails功能测试用例和将文件上载到ActionDispatch::Http::UploadFile

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

我正在向远程存储文件的Rails应用程序添加测试。我正在使用默认的Rails功能测试。我如何向它们添加文件上载?我有:

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有相同的问题。这个解决方案不起作用,文件只是以他提到的格式作为字符串到达控制器。