In questo post illustrerò un modo per sviluppare un sito web che usa Sinatra usando la pratica del TDD. Per poter provare gli esempi occorre aver seguito
i passi del mio precedente post.
Sinatra, come altri framework scritti in Ruby, aderisce allo standard Rack. In sintesi basta realizzare un oggetto
che risponde al messagio call, prende un hash come parametro e risponde con un vettore di tre elementi: lo status code, l'header http e il body.
Un esempio di un oggetto che rispetta lo standard è:
class HelloWorld
def call(env)
[200, {"Content-Type" => "text/plain"}, ["Hello world!"]]
end
end
Questo ha il vantaggio di avere degli oggetti già pronti per poter scrivere i test. Prima occorre da terminale eseguire il comando:
gem install rack-test
in modo da installare tutto ciò che ci serve.
A questo punto siamo pronti a scrivere il nostro primo test (il file l'ho chiamato sitetest.rb):
require './site'
require 'test/unit'
require 'rack/test'
class SiteTest < Test::Unit::TestCase
def test_homepage
browser = Rack::Test::Session.new(Rack::MockSession.new(Sinatra::Application))
browser.get '/'
assert browser.last_response.ok?
end
end
Creiamo anche il file (site.rb) dell'applicazione che per ora non ha impostato nessun routing:
require 'sinatra'
Se ora lanciamo il test con il comando ruby sitetest.rb
. Vediamo che l'assert fallisce.
Il codice minimo per la barra verde è:
require 'sinatra'
get '/' do
end
Rilanciamo il test ed ecco la prima barra verde!
A questo punto vogliamo che la nostra pagina abbia il contenuto Hello World. Aggiungiamo quindi un assert:
assert_equal browser.last_response.body, 'Hello World'
Lanciamo nuovamente il test ed otteniamo il messaggio:
1) Failure:
test_homepage(SiteTest) [sitetest.rb:13]:
<""> expected but was
<"Hello World">.
Modifichiamo il codice di produzione per la barra verde:
require 'sinatra'
get '/' do
'Hello World'
end
Alcune note:
- Affinchè un metodo venga eseguito dal test runner deve iniziare per test
Sinatra::Application
è l'oggetto che rispetta lo standard rack
- Maggiori dettagli su come scrivere i test usando Rack e Sinatra sono qui
Buon divertimento.
Ho iniziato a studiare lo sviluppo di applicazioni web con Ruby. Volevo qualcosa di più leggero di Rails per riuscire a padroneggiarlo in meno tempo
così la scelta è ricaduta su Sinatra.
Di seguito i passi da fare per poter lavorare su Windows con una macchina virtuale Ubuntu:
- Scaricare VirtualBox per windows da qui
- Scaricare l'iso dell'installazione di Ubuntu da qui. Ho scaricato l'ultima versione 11.10 a 32 bit.
- Da VirtualBox click su Nuova. Poi scegliere Linux e Ubuntu e dare un nome alla macchina virtuale (io ho scelto ubuntu-11.10)
- Come memoria ho impostato 1024Mb. Per il resto ho lasciato le impostazioni di default.
- Click su Avvia. Poi click sul simbolo della cartella e ho scelto il file appena scaricato dell'immagine di Ubuntu.
- Per l'installazione di Ubuntu ho lasciato tutti i default tranne il check di scaricare gli update.
- Una volta ravviata la macchina virtuale. Installare le Guest Additions (Menu di VirtualBox Dispositivi -> Installa Guest Additions..).
A me le ha installate automaticamente. Per verificare che siano installate dal menu Visualizza -> Adatta alla dimensione della finestra deve essere abilitato.
Ora possiamo installare Ruby
- Installiamo l'ultima versione (la 1.9.3) usando RVM
- Aprire Terminal e digitare il comando sudo apt-get update
- Poi installiamo curl con il comando: sudo apt-get curl
- Ora eseguiamo il comando: bash -s stable < <(curl -s https://raw.github.com/wayneeseguin/rvm/master/binscripts/rvm-installer ).
Non riuscirà ad installarlo perché mancano delle dipendenze. L'output del comando ci dirà cosa installare.
- Copiare quindi il comando: apt-get install build-essential openssl libreadline6 libreadline6-dev curl git-core zlib1g zlib1g-dev libssl-dev libyaml-dev libsqlite3-0 libsqlite3-dev sqlite3 libxml2-dev libxslt-dev autoconf libc6-dev ncurses-dev automake libtool bison subversion
- Rilanciare: bash -s stable < <(curl -s https://raw.github.com/wayneeseguin/rvm/master/binscripts/rvm-installer )
- Ora chiudere il terminale e riaprirlo
- Eseguire: rvm --default use 1.9.3
- se tutto è andato bene scrivendo ruby --version dovrebbe venire fuori che si sta usando la 1.9.3
- Ora siamo pronti per installare sinatra con: gem install sinatra
- Infine installiamo il webserver consigliato dal readme di Sinatra: gem install thin
A questo punto siamo pronti a scrivere la prima applicazione che usa Sinatra. Apriamo Text Editor e creiamo il file myapp.rb con il seguente contenuto:
require 'sinatra'
get '/' do
'Hello world!'
end
Da terminal lanciamo il comando: ruby -rubygems myapp.rb. Partirà il webserver che si metterà in ascolto sulla porta 4567.
Apriamo un browser e verifichiamo che il tutto funziona collegandoci all'url: locahost:4567.
Have fun!