2011-02-09 5 views
11

Я использую Paperclip и S3 для загрузки изображений, и я пытаюсь отключить вызовы на S3 из своего тестового набора. Я нашел thoughtbot поста, который упоминает делаетStubbing Paperclip S3 запросы в спецификациях

a.cover  { a.paperclip_fixture('album', 'cover', 'png') } 

, но это дает мне «неверное число аргументов (4 для 2)» ошибки. Я попытался переключить приведенные выше аргументы на массив, который удаляет исходную ошибку, но дает сообщение об ошибке «Атрибут уже определен: paperclip_fixture».

Кто-нибудь мог получить эту работу? Кроме того, я бы идеально хотел использовать локальную файловую систему для среды разработки. Есть простой способ сделать это?

+0

Не могли бы вы опубликовать более подробную информацию о коде, пожалуйста? Например, что такое a.cover? Я предполагаю, что a - это ваш объект, а обложка - это атрибут, содержащий URI для изображения? – hahuang65

+0

Кроме того, что именно вы пытаетесь протестировать? Это помогло бы иметь больше контекста здесь. – hahuang65

ответ

3

Вы используете shoulda? Если вы не используете shoulda метод paperclip_fixture, который вы используете, может происходить откуда-то еще и, следовательно, вести себя по-другому.

Потенциально отношение: https://github.com/thoughtbot/paperclip/blob/master/shoulda_macros/paperclip.rb

+0

@Eric M. Какой код вы добавили, чтобы действительно сделать эту работу? У меня такая же проблема –

+0

@ Eric M. @Eliza @Peter Nixey Было ли прямое решение этой проблемы? Я пробовал различные стратегии, включая «Скрепка» :: «Внука» на разных этапах без везения. Любые последующие предложения? – sorens

+0

@sorens - понятия не имею. Я боюсь. Я перешел от этого –

7

Хорошо, у меня есть основной вопрос выяснял. Это (я считаю), как сказала Элиза, потому что я не использую shoulda (я использую rspec 2.6.0 и factory_girl 2.1.2).

Вот что работало для меня (где Profile класса, который имеет отсоединяемый):

Profile.any_instance.stub(:save_attached_files).and_return(true) 
    @profile = Factory(:profile) 

На данный момент я просто иметь это право в моем before методе моего rspec примера. Вероятно, это лучшее место.

+3

не работает с paperclipe 3 –

1

Вот как я получил эту работу. Сначала у вас должен быть камень fakeweb, иначе он потерпит неудачу. Вы также должны иметь пустой файл в пути spec/support/paperclip/[model]/[attachment_name][ext].

То, что я сделал, это скопировать код из Paperclip и вставить его в мой завод. Мне не удалось заставить работать «paperclip_fixture».

factory :attachment do 
    file do |a| 
    # Stubbed Paperclip attachment from: https://github.com/thoughtbot/paperclip/blob/master/shoulda_macros/paperclip.rb#L68 
    # FIX: This was the only way I made this work. Calling the paperclip_fixture directly didn't work. 
    # See: http://stackoverflow.com/questions/4941586/stubbing-paperclip-s3-requests-in-specs 
    model, attachment, extension = "customer_attachment", "file", "doc"  
    definition = model.gsub(" ", "_").classify.constantize. 
         attachment_definitions[attachment.to_sym] 

    path = "http://s3.amazonaws.com/:id/#{definition[:path]}" 
    path.gsub!(/:([^\/\.]+)/) do |match| 
     "([^\/\.]+)" 
    end 

    begin 
     FakeWeb.register_uri(:put, Regexp.new(path), :body => "OK") 
    rescue NameError 
     raise NameError, "the stub_paperclip_s3 shoulda macro requires the fakeweb gem." 
    end 
    base_path = File.join(Rails.root, "spec", "support", "paperclip") 
    File.new(File.join(base_path, model, "#{attachment}.#{extension}")) 
    end 
end 
1

Вот как я заглушил файл из скрепки без использования помощников по использованию.

before(:each) do 
    @sheet = double('sheet') 
    @sheet.stub(:url).and_return(File.join(Rails.root, 'spec','fixtures','files', 'file.xls')) 
    active_record_object.stub(:sheet).and_return(@sheet) 
end 

Надеюсь, это поможет кому-то.

3

Многие из этих методов, похоже, не работают с последними скрепками и S3. Что, наконец, работал для меня сочетание:

AWS.config(:access_key_id => "TESTKEY", :secret_access_key => "TESTSECRET", :stub_requests => true) 

и

Mymodel.any_instance.stubs(:save_attached_files).returns(true) 

Но, на самом деле, все, что вам действительно нужно сделать во многих случаях является AWS: stub_requests и он будет достичь того, чего вы хотите ,

+0

'AWS.stub!' Также работает. – Sidane

+0

Я начал с вашей идеи, а затем, прочитав [документацию v2 для класса Aws :: Client] (http://docs.aws.amazon.com/sdkforruby/api/Aws/ClientStubs.html), решил, что это работает лучше: 'Aws.config = {stub_responses: true}' – sameers

1

Я только что наткнулся на это обновление приложения от Rails 2.3 до Rails 3.0 после того, как он последовал за Testing Paperclip on S3 with Cucumber & Factory Girl.

Вместо включения модуля Paperclip :: Shoulda в класс Factory, я должен был включить его в класс FactoryGirl :: DefinitionProxy, поэтому я изменил это:

class Factory 
    include Paperclip::Shoulda 
end 

в

class FactoryGirl::DefinitionProxy 
    include Paperclip::Shoulda 
end 

Для справки, я использую paperclip 2.4.1 и factory_girl 2.0.5.

5

Размещения это в моем файле «SPEC/rails_helper.rb» работал для меня:

require 'aws' 
AWS.stub! 
AWS.config(:access_key_id => "TESTKEY", :secret_access_key => "TESTSECRET") 
+0

Это должен быть принятый ответ, спасибо! – amrdruid

3

С последней скрепкой (от GitHub мастера филиала) и AWS-SDk версии 2, я решил мою проблему со следующей конфигурацией :

require "aws-sdk" 
Aws.config[:s3] = {stub_responses: true} 

Для получения дополнительной информации, пожалуйста, посмотрите на amazon sdk