我正在编写一个文件下载测试,在此期间我正在使用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>
我知道为什么这个测试失败了,但是如何修复呢?
答案 0 :(得分:0)
你应该考虑使用mocha进行存根,或者更好(在我看来)切换到使用rspec-rails。它们具有很好的模拟/存根功能,它们允许您进行更好的测试,使用更清晰的语法,并为您的测试文件结构提供更多组织。
这些宝石中的每一个都有关于如何模拟/存根调用的文档。
答案 1 :(得分:0)
找到解决方案。我没有尝试存根: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