2013-03-21 38 views
0

我正在嘗試使用Carrierwave上傳的rspec測試。基本上,我試圖測試處理以確保圖像是否已上傳和處理。我創建了一個後處理的示例文件,該文件應該與上傳後處理的測試文件相同。不過,我得到以下警告:carrierwave be_identical_to helper在rspec中不工作


ImageUploader the greyscale version should remove color from the image and make it greyscale 
Failure/Error: @uploader.should be_identical_to(@pregreyed_image) 
TypeError: 
    can't convert ImageUploader into String 
# ./spec/uploaders/image_uploader_spec.rb:24:in `block (3 levels) in <top (required)>' 

這裏是我的測試文件:

image_uploader_spec.rb

require File.dirname(__FILE__) + '/../spec_helper' 
require 'carrierwave/test/matchers' 

describe ImageUploader do 
    include CarrierWave::Test::Matchers 
    include ActionDispatch::TestProcess 

    before do 
    ImageUploader.enable_processing = true 
    @uploader_attr = fixture_file_upload('/test_images/testimage.jpg', 'image/jpeg') 
    @uploader = ImageUploader.new(@uploader_attr) 
    @uploader.store! 
    @pregreyed_image =    fixture_file_upload('/test_images/testimage_GREY.jpg', 'image/jpeg') 
    end 

    after do 
    @uploader.remove! 
    ImageUploader.enable_processing = false 
    end 

    context 'the greyscale version' do 
    it "should remove color from the image and make it greyscale" do 

     @uploader.should be_identical_to(@pregreyed_image) 
    end 
    end 
    end 

image_uploader.rb

class ImageUploader < CarrierWave::Uploader::Base 

    # Include RMagick or MiniMagick support: 
    include CarrierWave::RMagick 
    # include CarrierWave::MiniMagick 

    # Include the Sprockets helpers for Rails 3.1+ asset pipeline compatibility: 
    include Sprockets::Helpers::RailsHelper 
    include Sprockets::Helpers::IsolatedHelper 

    # Choose what kind of storage to use for this uploader: 
    storage :file 


    # Override the directory where uploaded files will be stored. 
    # This is a sensible default for uploaders that are meant to be mounted: 
    def store_dir 
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}" 
    end 


    # Process files as they are uploaded: 
    process :convert_to_grayscale 

    def convert_to_grayscale 
    manipulate! do |img| 
     img.colorspace = Magick::GRAYColorspace 
     img.quantize(256, Magick::GRAYColorspace) 
     img = yield(img) if block_given? 
     img 
    end 
    end 

回答

0

下方的蓋板be_identical_to使用的兩個參數FileUtils.identical?。所以,你的期望:

@uploader.should be_identical_to(@pregreyed_image) 

實際上是呼籲:

FileUtils.identcal?(@uploader, @pregreyed_image) 

因爲在我的測試環境我使用的文件存儲系統,我身邊這讓通過傳遞#current_path而不是上傳自己像這樣:

@uploader.current_path.should be_identical_to(@pregreyed_image) 

其實我最終需要直接比較上傳和我上傳實現==

class MyUploader < CarrierWave::Uploader::Base 
    ... 

    def ==(other) 
    return true if !present? && !other.present? 
    FileUtils.identical?(current_path, other.current_path) 
    end 
end