【问题标题】:How to stub/mock original_filename method in Rails using Test::Unit如何使用 Test::Unit 在 Rails 中存根/模拟 original_filename 方法
【发布时间】:2012-05-12 14:07:33
【问题描述】:

我正在编写一个文件下载测试,在此期间我使用的是 original_filename。我能够使用fixture_file_upload 模拟文件上传。但是如何存根/模拟 original_filename 调用。

def import_for_photo(picture_url, user)
  remote_photo = open(picture_url)
  remote_photo.original_filename = "#{user.id}.jpg"
  user.update_attributes({:picture => remote_photo})
end

测试

def test_import_for_photo
  fixture_file = fixture_file_upload(File.join('files', 'test.jpg'), 'image/jpeg')
  OpenURI.expects(:open_uri).returns(fixture_file)
  import_for_photo("http://dummy_url.com/dummy.jpg", users(:one))
  assert_equal "1.jpg", users(:one).reload.picture_file_name
end

测试输出,

NoMethodError: undefined method `original_filename=' for #<File:/tmp/test.jpg20120512-4253-x673nc-0>

我知道为什么这个测试失败了,但是如何解决呢?

【问题讨论】:

    标签: ruby-on-rails ruby unit-testing testing


    【解决方案1】:

    您应该考虑使用 mocha 进行存根,或者更好(在我看来)切换到使用 rspec-rails。它们有很好的模拟/存根工具,它们允许您进行更好的测试,使用更简洁的语法,并为您的测试文件结构提供更多的组织。

    这些 gem 中的每一个都有关于如何模拟/存根调用的现成文档。

    【讨论】:

      【解决方案2】:

      找到解决方案。我没有尝试存根:original_filename,而是存根:original_filename=(注意'='),我的问题就解决了!

      这里是代码

      def test_import_for_photo
        fixture_file = fixture_file_upload(File.join('files', 'test.jpg'), 'image/jpeg')
        fixture_file.expects(:original_filename=)
        OpenURI.expects(:open_uri).returns(fixture_file)
        import_for_photo("http://dummy_url.com/dummy.jpg", users(:one))
        assert_equal "1.jpg", users(:one).reload.picture_file_name
      end
      

      【讨论】:

        猜你喜欢
        • 2019-11-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-02
        • 1970-01-01
        • 2010-11-03
        • 1970-01-01
        • 2020-01-13
        • 1970-01-01
        相关资源
        最近更新 更多