Forum: Italian Ruby user group test di un worker con rspec

Posted by Lorenzo Sicilia (Guest)
on 2013-01-17 21:26
(Received via mailing list)
Ciao lista,

sto utilizzando sidekiq, rspec e rails 3.2.11. Vorrei fare un test di
integrazione con un worker che fa un upload di un file su SoundCloud
Devo essere incappato in qualche magia di rails che non colgo :)

il blocco di codice da testare:
def upload(audio)

      client = Soundcloud.new({
                                  :client_id      =>
APP_CONFIG[:sound_cloud_client_id],
                                  :client_secret  =>
APP_CONFIG[:sound_cloud_client_secret],
                                  :access_token  =>
APP_CONFIG[:sound_cloud_access_token]
                              })

      @track = client.post('/tracks', :track => {
          :title        => "[#{Rails.env}] #{audio.id} #{@vm.name}",
          :asset_data   => File.new(audio.file.path(:original)),
          :commentable  => false,
          :sharing => "private"
      })

 end

il mio test:

it "should upload an audio" do
      #audio = FactoryGirl.create(:audio, :file =>
File.new("#{Rails.root}/spec/fixtures/audio.m4a") )#
Rack::Test::UploadedFile.new( ) )
      audio = FactoryGirl.create(:audio, :file =>
Rack::Test::UploadedFile.new( "#{Rails.root}/spec/fixtures/audio.m4a",
'audio/m4a') )
      vm = FactoryGirl.create(:vm, :audio_id => audio.id)
      track = subject.upload(audio,vm).nil?.should be_false
end

il test fallisce dicendo
Error undefined method `map' for #<String:0x007ff1ec558d28>

Dopo un po' di fatica sono riuscito ad avere il backtrace che da
qualche dettaglio in pi:
--- !ruby/exception:NoMethodError
message: !binary |-
  dW5kZWZpbmVkIG1ldGhvZCBgbWFwJyBmb3IgIzxTdHJpbmc6MHgwMDdmZjFl
  YzU1OGQyOD4=
/Users/lorenzo/.rvm/gems/ruby-1.9.3-p194/gems/httmultiparty-0.3.7/lib/httmultiparty/multipartable.rb:10:in
`body='
/Users/lorenzo/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/net/http.rb:1910:in
`set_body_internal'
/Users/lorenzo/.rvm/gems/ruby-1.9.3-p194/gems/webmock-1.8.11/lib/webmock/http_lib_adapters/net_http.rb:263:in
`request_signature_from_request'
/Users/lorenzo/.rvm/gems/ruby-1.9.3-p194/gems/webmock-1.8.11/lib/webmock/http_lib_adapters/net_http.rb:75:in
`request'
/Users/lorenzo/.rvm/gems/ruby-1.9.3-p194/gems/httparty-0.7.8/lib/httparty/request.rb:69:in
`perform'
/Users/lorenzo/.rvm/gems/ruby-1.9.3-p194/gems/httparty-0.7.8/lib/httparty.rb:390:in
`perform_request'
/Users/lorenzo/.rvm/gems/ruby-1.9.3-p194/gems/httmultiparty-0.3.7/lib/httmultiparty.rb:81:in
`post'
/Users/lorenzo/.rvm/gems/ruby-1.9.3-p194/gems/soundcloud-0.2.9/lib/soundcloud.rb:105:in
`block in post'
/Users/lorenzo/.rvm/gems/ruby-1.9.3-p194/gems/soundcloud-0.2.9/lib/soundcloud.rb:168:in
`call'
/Users/lorenzo/.rvm/gems/ruby-1.9.3-p194/gems/soundcloud-0.2.9/lib/soundcloud.rb:168:in
`handle_response'
/Users/lorenzo/.rvm/gems/ruby-1.9.3-p194/gems/soundcloud-0.2.9/lib/soundcloud.rb:105:in
`post'
/Users/lorenzo/Documents/projects/rails/voicemap/app/workers/sound_cloud_worker.rb:32:in
`upload'
/Users/lorenzo/Documents/projects/rails/voicemap/app/workers/sound_cloud_worker.rb:13:in
`perform'
/Users/lorenzo/Documents/projects/rails/voicemap/spec/worker/sound_worker_spec.rb:21:in
`block (2 levels) in <top (required)>'

Ho capito che il problema  come viene gestito :asset_data   =>
File.new(audio.file.path(:original))
Se lo tolgo il post viene processato correttamente. Giustamente
soundcloud risponde che manca il file :)
Da notare che dentro il controller il mio worker funziona
correttamente. E' nell'ambiente di test che si schianta.
Ho provato diversi modi di passare il file audio ma non cambia nulla.

Qualche idea? Ho cercato in giro ma con scarsi risultati.
Posted by Riccardo Tacconi (rtacconi)
on 2013-01-24 14:55
Se ti funzione dal controller vuol dire che il problema e` nel tuo test. 
Dal test che hai postato non mi sembra di vedere qualcosa tipo:

worker = Worker.new
worker.perform(file: 'path')

se il metodo upload(audio) sta dentro il worker ti consiglio di 
nuoverlo:

def perform(track_id)
  track = Track.find(track_id)
  track.upload
end

track.upload lo testi come qualsiasi perte di rails
Posted by Lorenzo Sicilia (Guest)
on 2013-01-25 09:59
(Received via mailing list)
2013/1/24 Riccardo Tacconi <rtacconi@gmail.com>:
> Se ti funzione dal controller vuol dire che il problema e` nel tuo test.

Su questo concordiamo :)

>   track.upload
> end

Infatti non c' ma  equivalente quello che ho scritto io.
subject.upload o subject.perform vanno scattare lo stesso problema.

 Nel frattempo ho capito qualcosa di pi.
L'errore diceva:
"undefined method `map' for #<String:0x007f9ddfe8cd60>"

Ho indagato sulla riga dello stack
(~/.rvm/gems/ruby-1.9.3-p194/gems/httmultiparty-0.3.7/lib/httmultiparty/multipartable.rb:10)
e in effetti li arriva una stringa anzich un array.
La stringa contiene tutto il body della request. Non ho capito per
dove la stringa non viene convertita in array.

Grazie cmq per la risposta ;)
ciao lo
Please log in before posting. Registration is free and takes only a minute.
Existing account (Switch to SSL-encrypted connection)
NEW: Do you have a Google/GoogleMail or Yahoo account? No registration required!
Log in with Google account | Log in with Yahoo account
No account? Register here.