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 sequência
- 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
template :index do
"<form=\"\" action=\"/\" method=\"post\">
<label for=\"message\">Message</label>
<input type=\"text\" name=\"message\" id=\"message\">
<button>Message!</button>
</form>"
end
get '/' do
erb :index
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.