Clipe de papel validates_attachment_size com RSpec (> = 2.3.5 | <= 3.0.0)

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 sizeatributo do arquivo, mas a gem do clipe de papel não está usando diretamente o sizeatributo (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_tempfilepara converter o arquivo passado em um fluxo.
Em seguida, o tamanho do fluxo é usado para preencher o attachment_file_sizecampo.

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