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