0

如何在 RSpec 中模拟这个调用?

require 'open-uri'
class FileFoo < ActiveRecord::Base
  def download image_url
    open("tmp/#{file}", 'wb') do |file|
      file << open(image_url).read
    end
  end
end

尝试模拟 FileFoo.open,但这不起作用,因为我使用的是下载的文件,而不是返回值。

将代码更改为file << Kernel.open(image_url).read,并使用以下内容:

Kernel.stub_chain(:open, :read).and_return(File.read image_fixture)

这很好用,但是有没有一种方法可以模拟Kernel.open().read,而不显式调用内核?

4

2 回答 2

2

通常我认为在这种情况下更好的测试不是模拟特定的文件系统调用,而是使用像fakefs这样的 gem 来存根文件系统。

我在一篇名为Fake It的博客文章中详细讨论了它!.

这个想法是存根特定的文件系统调用非常脆弱,但是在单元测试中也不一定需要写入实际的文件系统。很多时候,像fakefs这样的东西是一种很好的快乐媒介。

于 2012-12-05T04:45:41.373 回答
1

我认为这很困难,因为方法的设计download很差。它正在做两件事:

  1. 通过 HTTP 获取文件
  2. 将其保存到磁盘

这些单独的函数都应该被测试,第一个应该被模拟。我看不出任何模拟文件系统的理由,因为保存文件(很小)是快速且易于测试的。

如果将该方法分为两种方法,则:

  1. fetch with http将返回文件。
  2. save file会保存它。

这种方法使模拟和测试变得简单。

于 2012-12-09T15:43:50.790 回答