2015-09-17 4 views
2

Я использую Paperclip/RSpec и StackOverflow помог мне успешно окурок загрузку файлов на S3 с помощью этого кода:Stubbing Скрепка загружает из S3 в RSpec

SPEC/rails_helper.rb

config.before(:each) do 
    allow_any_instance_of(Paperclip::Attachment).to receive(:save).and_return(true) 
end 

Это отлично работает.

На моей модели у меня есть два PAPERCLIP поля:

class MyModel < ActiveRecord::Base 
    has_attached_file :pdf 
    has_attached_file :resource 
end 

Мой код использует #copy_to_local_file method (Docs) для извлечения файла из S3.

#copy_to_local_file принимает два параметра: стиль (:original, :thumbnail и т. Д.) И локальный путь к файлу для копирования.

Пример:

MyModel.resource.copy_to_local_file(:original, local_file.path) 

Когда тестируемая система пытается получить доступ к MyModel#pdf#copy_to_local_file или MyModel#resource#copy_to_local_file, я первоначально получил ошибки вроде следующего:

No Such Key - cannot copy /email_receipts/pdfs/000/000/001/original/email_receipt.eml.pdf to local file /var/folders/4p/1mm86g0n58x7d9rvpy88_s9h0000gn/T/receipt20150917-4906-13evk95.pdf 
No Such Key - cannot copy /email_receipts/resources/000/000/001/original/email_receipt.eml to local file /var/folders/4p/1mm86g0n58x7d9rvpy88_s9h0000gn/T/resource20150917-4906-1ysbwr3.eml 

Я понимаю, что эти ошибки происходили из-за добавления в S3 , поэтому, когда он встречает MyModel#pdf#copy_to_local_file или MyModel#resource#copy_to_local_file, он пытается захватить файл в S3, которого там нет.

Текущее решение:

Я сумел подавить ошибки выше, но я чувствую, что это не полное решение и дает мои тесты ложное чувство безопасности. Мое половина решения незавершенного этого метод следующим образом:

спецификации/rails_helper.rb

before(:each) do 
    allow_any_instance_of(Paperclip::Storage::S3).to receive(:copy_to_local_file) 
end 

Хотя это гасит метод #copy_to_local_file и удаляет ошибки, Безразлично» t фактически записывать любой контент в локальный файл, который предоставляется в качестве второго аргумента #copy_to_local_file, поэтому он не совсем имитирует файл, загружаемый с S3.

Вопрос:

Есть ли способ незавершенной #copy_to_local_file и иметь его записать содержимое консервов файла в моем spec/factories/files каталога в локальный файл (его второй аргумент)?

Или я переусердствовал это? Это то, о чем я не должен беспокоиться?

ответ

0

Вам не нужно беспокоиться о том, действительно ли «загруженные» файлы существуют в ваших тестах. Вы решили вырезать Paperclip, так что сделайте это полностью, набрав как #save, так и #copy_to_file. Вам также может потребоваться заглушить чтение загруженных файлов из файловой системы.

Все это приводит к ошибкам интеграции, поэтому вы, вероятно, должны написать спецификацию функции (используя скрытый браузер, такой как полтергейст), который фактически загружает и загружает что-то и читает его из файловой системы.

Это говорит, что вы можете сделать все, что вы хотите в заглушке RSpec, передав ей блок:

allow_any_instance_of(Paperclip::Storage::S3).to receive(:copy_to_local_file) do |style, local_dest_path| 
    # write a file here, or do anything you like 
end 
+0

Спасибо! Я выплюнул все и обязательно проведу интегральную проверку. Отличная идея. – madcow

Смежные вопросы