9

我的控制器访问tempfile上传文件的属性并将其传递给另一个模拟组件。我的测试代码有

  @file = mock(Object)
  @file.stub_chain(:tempfile, :path).and_return('thefile.zip')
  # ...
  post :create, :file => @file

和控制器代码调用params[:file].tempfile.path

从 Rails 3.0 升级到 3.1 后,上述行开始失败

undefined method `tempfile' for "#[RSpec::Mocks::Mock:0x2b0d9a0 @name=Object]":String

也就是说,Rails 3.1params[:file]自动转换为字符串。

通过浏览器手动测试时,代码可以正常工作。我尝试使用fixture_file_upload,参数变成了一个File对象,但它没有tempfile方法。

那么如何将任意模拟对象作为参数传递给 Rails 3.1 中的操作?

4

3 回答 3

15

终于找到了this,这说明虽然返回的东西fixture_file_upload@tempfile成员,但是缺少reader方法。解决如下

  FileUtils.touch('file.zip') # fixture_file_upload needs the file to exist
  @file = fixture_file_upload('file.zip')
  class << @file
    # The reader method is present in a real invocation,
    # but missing from the fixture object for some reason (Rails 3.1.1)
    attr_reader :tempfile
  end
于 2011-10-17T14:35:54.567 回答
3

我绕着这条路

upload_file = fixture_file_upload('files/stats_upload.csv', 'text/csv')
upload_file.stubs(:tempfile).returns(upload_file)
于 2013-02-02T16:35:45.980 回答
0

我提出了一个拉取请求来解决这个问题,如果你喜欢,请+1:https ://github.com/brynary/rack-test/pull/67

于 2012-11-06T13:46:08.913 回答