2011-02-09 10 views
11

Używam aplikacji Paperclip i S3 do przesyłania obrazów i próbuję zablokować połączenia do S3 z mojego zestawu testów. Znalazłem stanowisko thinkbota, które wspomina o zrobieniu tego, co robię, ale podaje mi błąd "zła liczba argumentów (4 za 2)". Próbowałem przełączyć powyższe argumenty na tablicę, która usuwa pierwotny błąd, ale daje komunikat "Atrybut już zdefiniowany: paperclip_fixture".Zapytanie o numerowanie S3 w specyfikacji

Czy ktoś mógł to sprawdzić? Poza tym chciałbym użyć lokalnego systemu plików dla środowiska programistycznego. Czy istnieje prosty sposób na zrobienie tego?

+0

mógłbyś zamieścić więcej informacji o kodzie proszę? Na przykład czym jest a.cover? Zakładam, że to twój obiekt, a osłona to atrybut zawierający URI do obrazu? – hahuang65

+0

Co dokładnie próbujesz przetestować? Pomoże to mieć większy kontekst tutaj. – hahuang65

Odpowiedz

3

Czy używasz shoulda? Jeśli nie używasz shoulda, metoda paperclip_fixture, której używasz, może pochodzić z innego miejsca, a zatem zachowywać się inaczej.

Potencjalnie istotne: https://github.com/thoughtbot/paperclip/blob/master/shoulda_macros/paperclip.rb

+0

@Eric M. Jaki kod dodałeś do tego, żeby to zadziałało? Mam ten sam problem. –

+0

@Eric M. @ Eliza @ Peter Nixey Czy było proste rozwiązanie tego problemu? Próbowałem różnych strategii obejmują 'Paperclip :: Shoulda' na różnych etapach bez powodzenia. Wszelkie dalsze sugestie? – sorens

+0

@sorens - nie mam pojęcia, że ​​się boję. Przeniosłem się z tego –

7

Ok, mam podstawowy problem zorientowali się. To jest (myślę), jak powiedziała Eliza, ponieważ nie używam shoulda (używam rspec 2.6.0 i factory_girl 2.1.2).

Oto co pracował dla mnie (gdzie Profile jest klasa, która ma załączniki):

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

W tej chwili mam tylko tego prawa w moim before sposobie mojego rspec przykład. Prawdopodobnie jest lepsze miejsce na to.

+3

nie działa z paperclipe 3 –

1

Tak to działało. Najpierw musisz mieć klejnot fakeweb, albo się nie uda. Musisz również mieć pusty plik na ścieżce spec/support/paperclip/[model]/[attachment_name][ext].

To, co zrobiłem, to skopiować kod z Paperclip i wkleić go do mojej fabryki. Nie udało mi się uruchomić funkcji "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

W ten sposób zgrywam plik z spinacza bez użycia pomocników.

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 

Mam nadzieję, że to komuś pomaga.

3

Wiele z tych technik nie działa z najnowszym spinaczem i S3. Co ostatecznie pracował dla mnie jest kombinacją:

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

i

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

Ale, faktycznie, wszystko co naprawdę trzeba zrobić w wielu przypadkach jest AWS: stub_requests i będzie osiągnąć to, co chcesz .

+0

'AWS.stub!' Również działa. – Sidane

+0

Zacząłem od pomysłu, a następnie przeczytanie [dokumentacji v2 dla klasy 'Aws :: Client'] (http://docs.aws.amazon.com/sdkforruby/api/Aws/ClientStubs.html) zdecydowało, że działa to lepiej: 'Aws.config = {stub_responses: true}' – sameers

1

Właśnie natknąłem się na tę aktualizację aplikacji z Rails 2.3 do Rails 3.0 po przejściu przez Testing Paperclip on S3 with Cucumber & Factory Girl.

Zamiast tym moduł Spinacz :: shoulda do klasy Factory miałem włączenie go do klasy FactoryGirl :: DefinitionProxy, więc zmieniłem to:

class Factory 
    include Paperclip::Shoulda 
end 

do

class FactoryGirl::DefinitionProxy 
    include Paperclip::Shoulda 
end 

Dla odniesienia używam spinacza 2.4.1 i factory_girl 2.0.5.

5

Umieszczenie w moim 'SPEC/rails_helper.rb' pliku pracował dla mnie:

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

To powinna być zaakceptowana odpowiedź, dziękuję! – amrdruid

3

Z najnowszej spinacza (od github mistrz oddziału) i AWS-sdk wersji 2, I rozwiązać mój problem z następującą konfigurację :

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

Aby uzyskać więcej informacji, proszę zapoznać się amazon sdk