如何使用Rails测试在tmp文件夹中使用图像的方法

时间:2014-05-13 23:45:13

标签: ruby-on-rails ruby rspec

我正在尝试(使用rspec)测试一个方法,该方法将决定给定png文件的颜色。在我的应用程序中,此文件位于/ tmp文件夹中。但是我如何在测试中做到这一点?

def decide_background(background, screenshot_path)
  background = background.delete(" ")

  self.screenshot = screenshot_path
  self.background = background

  unless screenshot_path.nil? || screenshot_path.empty?
    image = ChunkyPNG::Image.from_file(screenshot_path)
    background = ImageManipulation::get_bg_from_edges(image).delete(" ")
    unless background.empty?
      self.background = background
    end
  end

  if self.background == 'rgba(0,0,0,0)'
    self.background = 'rgb(255,255,255)'
  end

  self.save
end

此方法接收两个参数:
1 - 背景:类型为“rgb(0,0,0)”的字符串 2 - screenshot_path:存储屏幕截图的路径,位于/tmp/#{name_of_file}

我想确保该方法实际存储正确的背景。所以,我想我需要模拟ImageManipulation::get_bg_from_edges(image).delete(" ")以避免依赖,因为我没有测试该方法。但是我该怎么做?

另外,我如何通过screenshot_path?我应该在/ tmp文件夹中为此单元测试创​​建一个文件吗?

1 个答案:

答案 0 :(得分:1)

鉴于这是一个单元测试,你应该模拟from_file。测试ChunkyPNG没有任何好处;我相信它的作者已经为你测试了它。在此方法的示例中:

image = double image # ha, I said "double image"
expect(ChunkyPNG::Image).to receive(:from_file).with(# whatever screenshot path should be) { image }
expect(ImageManipulation).to receive(:get_bg_from_edges).with(image) { # whatever background you like }

你可能也想要一个能够满足这个代码的集成测试(实际上我已经写过了第一个),然后你真的希望磁盘上的图像能够读取。您是否需要将其作为集成测试设置的一部分放在那里,或者您的应用是否应该将其放在那里取决于您的应用。