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.