2016-04-25 2 views
0

Я новичок в ruby ​​и rspec. У меня есть модуль, который взаимодействует с S3 в рубине. В моем коде я:Как мне высмеять S3Object.read do | chunk | используя rspec

  1. создать новый S3 экземпляр: s3 = AWS :: S3.new()
  2. Получите мое ведро: @ s3bucket = s3.buckets [@bucket]
  3. Retrieve мой S3Object: объект = @ s3bucket.objects [ключ]
  4. Наконец, я сохранить объект в локальный файл:

    File.open(local_filename, 'wb') do |s3file| 
    object.read do |chunk| 
        return completed if stop? 
        s3file.write(chunk) 
    end 
    

Мой код работает хорошо, но у меня возникают проблемы с его тестированием,
конкретно У меня проблемы с издевательством object.read do | chunk | часть.
Независимо от того, что я пытаюсь, кусок оказывается пустым.
Может ли кто-нибудь помочь?
Спасибо.

+0

Я нашел этот драгоценный камень: https://github.com/jubos/fake-s3. Если вы хотите вручную обмануть его, просто поместите в свой метод bind.pry или byebug debugger и выясните класс и содержимое объекта S3. Затем do allow_any_instance_of (<класс S3>) для получения (<метод, который вы вызываете на нем>). And_return (<возвращаемое значение вашего метода>) –

+0

Я пробовал это, я думаю, что у меня проблема с пониманием объекта вернитесь в часть and_return. try string, stringio, byte array, File.open. ничего не получилось. в моем тесте я все равно не получаю никаких кусков, и s3file пуст –

+0

См. мой ответ ниже и дайте мне знать, если у вас есть какие-либо вопросы. Я бы поставил его в комментарии, но в этом случае нет форматирования кода. –

ответ

1

попробовать это:

s3_object = class_double("S3Object") 
allow(s3_object).to receive(:read).and_return(<what ever you want>) 

Если вам нужно нужно хранить ответы API в своих тестах, не делая несколько звонков, проверьте https://github.com/vcr/vcr

+0

с каких это пор? и что заменило его? – neo

+0

Хорошо, и если у меня нет доступа к s3_object? попытался разрешить (AWS :: S3 :: S3Object.any_instance). получать (: читать) .and_yield ('test'), не работал –

+0

, в чью версию вы используете? Должно быть allow_any_instance_of (AWS :: S3) .to_receive (: read) .and_return (<возвращаемое значение метода>) –

0

Если вы хотите, чтобы дразнить это:

create a new S3 instance : s3 = AWS::S3.new() 

Вы делаете

allow_any_instance_of(AWS::S3).to_receive(:new).and_return(<the return value of the method>) 

Вы можете использовать видеомагнитофон, как было предложено ранее, но вы столкнетесь с проблемами, если работаете в команде, и вы запускаете свои тесты одновременно с другим членом команды, если вы оба удалили одну и ту же кассету.

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