Quero testar um upload de arquivo em trilhos, mas não sei como fazer isso.
Aqui está o código do controlador:
def uploadLicense
#Create the license object
@license = License.create(params[:license])
#Get Session ID
sessid = session[:session_id]
puts "\n\nSession_id:\n#{sessid}\n"
#Generate a random string
chars = ("a".."z").to_a + ("A".."Z").to_a + ("0".."9").to_a
newpass = ""
1.upto(5) { |i| newpass << chars[rand(chars.size-1)] }
#Get the original file name
upload=params[:upload]
name = upload['datafile'].original_filename
@license.format = File.extname(name)
#calculate license ID and location
@license.location = './public/licenses/' + sessid + newpass + name
#Save the license file
#Fileupload.save(params[:upload], @license.location)
File.open(@license.location, "wb") { |f| f.write(upload['datafile'].read) }
#Set license ID
@license.license_id = sessid + newpass
#Save the license
@license.save
redirect_to :action => 'show', :id => @license.id
end
Eu tentei essa especificação, mas ela não funciona:
it "can upload a license and download a license" do
file = File.new(Rails.root + 'app/controllers/lic.xml')
license = HashWithIndifferentAccess.new
license[:datafile] = file
info = {:id => 4}
post :uploadLicense, {:license => info, :upload => license}
end
Como posso simular o upload de arquivos usando o rspec?
ruby-on-rails
file-upload
tdd
rspec-rails
user727403
fonte
fonte
post
foi um método auxiliar de caminho, cujo único argumento pretendido não coloquei entre parênteses, portanto, os seguintes tokens foram interpretados como argumentos adicionais para o auxiliar, em vez de argumentos para a própria publicação. Por exemplo, eu tinha empost order_documents_path @order, document: file
vez depost order_documents_path(@order), document: file
.Não tenho certeza se você pode testar o upload de arquivos usando apenas o RSpec. Você já experimentou a Capivara ?
É fácil testar o upload de arquivos usando o
attach_file
método da capivara a partir de uma especificação de solicitação.Por exemplo (este código é apenas uma demonstração):
fonte
se você incluir Rack :: Test *, inclua simplesmente os métodos de teste
então você pode usar o método UploadedFile:
* NOTA: Meu exemplo é baseado no Sinatra, que estende o Rack, mas deve funcionar com o Rails, que também usa Rack, TTBOMK
fonte
include Rack::Test::Methods
usar o Rack :: Test :: UploadedFile.require 'rack/test
basta.require 'rack/test'
. se você estiver usando,Rack::Test::UploadedFile
é bom o suficiente para usá-lo. Desde que a configuração do seu aplicativo Rails esteja correta. PS: Estou noRails 4
eruby 2.1
rack/test
incluirá tudo, desde teste, o que incluitest/methods
, mas também inclui tudo em teste, portanto, provavelmente, mais do que você precisa.Não fiz isso usando o RSpec, mas tenho um teste Test :: Unit que faz algo semelhante ao fazer upload de uma foto. Configurei o arquivo carregado como uma instância de ActionDispatch :: Http :: UploadedFile, da seguinte maneira:
Algo semelhante pode funcionar para você também.
fonte
Foi assim que eu fiz
Rails 6
,RSpec
eRack::Test::UploadedFile
NÃO inclua
ActionDispatch::TestProcess
ou qualquer outro código, a menos que tenha certeza do que está incluindo.fonte
Eu tive que adicionar os dois inclui para fazê-lo funcionar:
fonte