Vou mostrar a você como testar com RSpec 1.3.2 o validador de tamanho de anexo validado para o clipe de papel gem entre as versões 2.3.5 e 3.0.0.
Estou atualizando um aplicativo enorme de Rails 2.2.2 para 2.3.17. Durante esta atualização, decidimos também atualizar o clipe de papel para a versão mais recente que podemos ter.
Portanto, agora estamos usando a versão 2.7.5.
Corrigindo nossas especificações, encontrei uma especificação testando o validador de tamanho de anexo de validação que não estava mais funcionando:
it "should validate size of file is less than 10Mb" do
file = File.new("#{Rails.root}/spec/fixtures/file.txt")
file.stub(:size).and_return(11.megabytes)
@information.attachment = file
@information.should_not be_valid
@information.should have(1).error_on(:attachment)
end
RSpec está copiando bem o size
atributo do arquivo, mas a gem do clipe de papel não está usando diretamente o size
atributo (ou quero dizer, no final, não é aquele que é usado).
Dando uma olhada no código gem, descobri que o clipe de papel está chamando o IOStream#to_tempfile
para converter o arquivo passado em um fluxo.
Em seguida, o tamanho do fluxo é usado para preencher o attachment_file_size
campo.
Para corrigir isso, Nick Sieger implementou o seguinte (commit ef7233d25700a7e69cebd2334b656fa9ca0ae927 :
def to_tempfile(object)
return object.to_tempfile if object.respond_to?(:to_tempfile)
...
Isso vai nos salvar! 🙂
Agora, a especificação de aprovação é a seguinte:
it "should validate size of file is less than 10Mb" do
file = File.new("#{Rails.root}/spec/fixtures/file.txt")
file.stub(:size).and_return(11.megabytes)
file.stub(:to_tempfile).and_return(file)
@information.attachment = file
@information.should_not be_valid
@information.should have(1).error_on(:attachment_file_size)
end