Unix and Me

About unix, web programing and me

Sinatra e Capybara

Seguindo nosso projeto anterior sobre Sinatra Hello Sinatra vamos agora usar o Capybara para fazer os "testes de aceitação".

Adicionar a gem

O nosso projeto é baseado no post Hello Sinatra ;), agora vamos pegar o projeto e adicionar a gem do capybara:

% git clone git://github.com/dmitrynix/sinatra-demo-app-post.git

Adicionar a gem no Gemfile:

source 'http://rubygems.org'

gem 'sinatra'

group :development, :test do
  gem 'rspec'
  gem 'rack-test', :require => 'rack/test'
  gem 'capybara'
end

E executar o bundle install.

Primeiro teste

Nosso exemplo será de um formulário simples que a pessoa vai escrever uma mensagem e ela aparecerá após ela enviar para o servidor.

Como já temos um projeto basta adicionar ao spec_helper.rb o conteúdo:

require 'capybara/rspec'

Esse require, claro, deve ser depois do require das rubygems ou depois do require do bundler.

E dizer ao capybara qual a nossa app rack:

Capybara.app = DemoApp::Application

Agora vamos ao nosso primeiro spec:

require 'spec_helper'

feature 'the message process' do
  it 'expose message' do
    visit '/'

    fill_in 'Message', :with => 'Hi!'

    click_button 'Message!'

    page.should have_content 'Sua mensagem foi "Hi!"'
  end
end

Na sequencia

  • Visite a url '/' da aplicação;
  • Preencha o input do label correspondente com o nome "Message";
  • Click no butão "Message!";
  • No final deste processo deve ter a nossa mensagem.

Certamente ele irá falhar:

% rspec spec/demo_app_spec.rb
F

Failures:

  1) the message process expose message
     Failure/Error: within("#message") do
     ArgumentError:
       rack-test requires a rack application, but none was given
     # (eval):2:in `find'
     # ./spec/demo_app_spec.rb:5:in `block (2 levels) in <top (required)>'

Finished in 0.22032 seconds
1 example, 1 failure

Failed examples:

rspec ./spec/demo_app_spec.rb:4 # the message process expose message

Agora vamos modificar nossa aplicação para o spec:

module DemoApp
  class Application < Sinatra::Base
    get '/' do
<<END
<form action="/" method="post">
  <label for="message">Message</label>
  <input type="text" name="message" id="message">
  <button>Message!</button>
</form>
END
    end

    post '/' do
      "Sua mensagem foi \"#{params[:message]}\""
    end
  end
end

E ele irá passar:

% rspec spec/demo_app_spec.rb
.

Finished in 0.36823 seconds
1 example, 0 failures

Alguns preferem escrever os specs dentro de spec/integration, mas eu já vi também em spec/acceptance.

Como de costume o projeto está no github: sinatra-and-capybara-demo

Comments