Testing file upload (Sinatra, RSpec, Rack-Test)

Hi.

I have a simple application and I want to add a file upload
functionality. How can I write a spec?

Here’s my try.

directory structure

app:

  • controller.rb
  • controller.spec.rb
  • files: []
  • fixtures: [test_file.png]

controller.spec.rb

require ‘rack/test’
require ‘controller’

module MyHelpers
def app
Sinatra::Application
end
end

Spec::Runner.configure do |conf|
conf.include Rack::Test::Methods
conf.include MyHelpers
end

describe ‘Application’ do
it ‘should accept uploaded files and save them into the files
directory’
post ‘/’, ‘file’ =>
Rack::Test::UploadedFile.new(‘fixtures/test_file.png’, ‘image/png’)
Dir[‘files/*’].should include(‘files/test_file.png’)
end
end

controller.rb

require ‘sinatra’
require ‘fileutils’

post ‘/’ do
tempfile = params[‘file’][:tempfile]
FileUtils.copy_file(tempfile.path, ‘files’)
end

But when I ran…

$ spec -f specdoc controller.rb

…I get the following output.

Application

  • should accept uploaded files and save them into the files directory
    (FAILED - 1)

‘Application should accept uploaded files and save them into the files
directory’ FAILED
expected [] to include “files/test_file.png”
<path_to_app>/controller.spec.rb:<line_number>:in `block (2 levels) in
<top (required)>’

Finished in 0.132799038 seconds

1 example, 1 failure

What I do wrong?

Thanks.

Debian GNU/Linux 5.0.4;
Ruby 1.9.2;
Sinatra 0.9.6;
RSpec 1.3.0;
Rack-Test 0.5.3.

P. A. wrote:

Hi.

I have a simple application and I want to add a file upload
functionality. How can I write a spec?

Here’s my try.

directory structure

app:

  • controller.rb
  • controller.spec.rb
  • files: []
  • fixtures: [test_file.png]

controller.spec.rb

require ‘rack/test’
require ‘controller’

module MyHelpers
def app
Sinatra::Application
end
end

Spec::Runner.configure do |conf|
conf.include Rack::Test::Methods
conf.include MyHelpers
end

describe ‘Application’ do
it ‘should accept uploaded files and save them into the files
directory’
post ‘/’, ‘file’ =>
Rack::Test::UploadedFile.new(‘fixtures/test_file.png’, ‘image/png’)
Dir[‘files/*’].should include(‘files/test_file.png’)
end
end

controller.rb

require ‘sinatra’
require ‘fileutils’

post ‘/’ do
tempfile = params[‘file’][:tempfile]
FileUtils.copy_file(tempfile.path, ‘files’)
end

But when I ran…

$ spec -f specdoc controller.rb

…I get the following output.

Application

  • should accept uploaded files and save them into the files directory
    (FAILED - 1)

‘Application should accept uploaded files and save them into the files
directory’ FAILED
expected [] to include “files/test_file.png”
<path_to_app>/controller.spec.rb:<line_number>:in `block (2 levels) in
<top (required)>’

Finished in 0.132799038 seconds

1 example, 1 failure

What I do wrong?

Thanks.

Debian GNU/Linux 5.0.4;
Ruby 1.9.2;
Sinatra 0.9.6;
RSpec 1.3.0;
Rack-Test 0.5.3.

I found out the source of the problem by myself. It was in the
FileUtils.copy_file method. As it turned out this method doesn’t accept
a directory name as the second argument. It needs both the first
argument and the second argument to be a file names. So, the updated
code looks like the following.

controller.rb

post ‘/’ do
tempfile = params[‘file’][:tempfile]
FileUtils.copy_file(tempfile.path,
“files/#{params[‘file’][:filename]}”) # the problem was here
end

All works now (and that’s enough for man to be happy).

Thank you for your attention.

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.

| Privacy Policy | Terms of Service | Remote Ruby Jobs