MouseOver Studio

MouseOver Studio header image 2

Demorou mas chegou: VRaptor Sexy URLs e RSpec::VRaptor

janeiro 27th, 2009 por Diego Carrion · 3 comentários

A galera que me segue no Twitter já está sabendo da noticia mas para os que não, aqui vá:

VRaptor Sexy URLs

Estou publicando oficialmente o VRaptor Sexy URLs. O VRaptor Sexy URLs é um fork da versão oficial do VRaptor 2 que ao contrario de trabalhar sobre uma servlet, trabalha sobre um filtro, pelo que junto à outras configurações permite que chamemos nossas actions no estilo:

http://my.host.com/controller/action

Anteriormente tínhamos que chamar nossas actions de um jeito que, após trabalhar com Rails, nunca mais considerei tão legal:

http://my.host.com/controller.action.logic

Eu me comuniquei com o Fabio Kung para tentar colocar minhas alterações no repositório oficial mas eles já estão trabalhando na mesma solução, implementada de outro jeito. Parece que na próxima versão do VRaptor essas implementações já estarão disponiveis, ate lá podem ir utilizando o fork que se encontra no GitHub.

RSpec::VRaptor

O RSpec::VRaptor é talvez a melhor coisa que pode ser aproveitada ao utilizar o VRaptor Sexy URLs. O RSpec::VRaptor foi inspirado no RSpec::Rails e funciona de forma muito similar.

Para os que não conhecem o RSpec::Rails, ele é um plugin para
o Rails que permite, entre outras coisas, testar os controllers dele sem ter que se preocupar por criar um monte de mocks que simulem o stack do Rails. Legal ne? O RSpec::VRaptor faz o mesmo com o VRaptor Sexy URLs.

Em poucas palavras, você pode testar seu controllers assim:

describe UserController do

  context "no serviço xpto" do
  
    before :all do
      get "/user/xpto", :request => {'param1' => 'value1'}, 
                        :session => {'login' => 'dcrec1'}, 
                        :inject => {'user' => User.new},
                        :headers => {'Host' => '20.85.17.10'}
    end
    
    it "deve enviar à view um atributo 'logado' como true" do
      @request.attributes['logado'].should be_true
    end
    
    it "deve retornar como código de resposta 203" do
      @response.status.should eql(203)
    end
    
    it "deve salvar na sessão o valor do param1" do
      @session.attributes['param1'].should eql('value')
    end
  
  end

end

Acredito que não exista nenhuma solução na linguagem Java que permita criar testes funcionais tão elegantes. Se você é um programador Java e ainda não desenvolve em Ruby, essa aqui é uma excelente demostração de por que você deveria começar a aprender a linguagem. Pode ser que você não chegue a utilizar o VRaptor Sexy URLs, mas você poderia criar algo similar para teu framework de preferencia.

Se nos dirigirmos à documentação do VRaptor, na parte de testes, poderemos ver que eles sugerem testar os controllers instanciando eles e setando os parâmetros. Isso se deve a que as anotações não são interpretadas pelo que temos que realizar as injeções manualmente. Devemos modificar nosso código para que possa ser testável ate um certo ponto, dado que como as anotações não participam, não sabemos se colocamos elas certas ou se temos esquecido de alguma.

Com RSpec::VRaptor não temos esse problema, devido a que as anotações e as rotas são interpretadas normalmente, como se a requisição tivesse vindo via http! Podemos também utilizar os parâmetros opcionais :request, :inject, :session e :headers para definir os parâmetros do request, injetar objetos no controller, modificar a sessão http e também alguns headers, respetivamente.

Além de tudo isso também ganhamos as features do excelente RSpec, como os mocks, expectativas e a possibilidade de imprimir a saída dos testes em diversos formatos e poder integrar ele com ferramentas muito boas como o autotest-notification ou ate o Cucumber!

Tudo isto é possível por causa do JRuby, excelente tecnologia que nos permite integrar as linguagens Ruby e Java. De novo, se você programa em Java e ainda não aprendeu Ruby, não perda mais tempo. Aprendendo Ruby você vai ser tornar também um melhor programador Java, vai poder utilizar o RSpec::VRaptor é também as novas surpresas que estão por vir.

Tags: java · jruby · rspec · ruby · vraptor

3 respostas ate agora ↓

  • 1 Fabio Kung // jan 28, 2009 at 1:27 pm

    Oi Diego,

    Antes de tudo parabéns! As modificações que você fez são sensacionais.

    Realmente já estamos trabalhando em algo parecido com o sexy-urls para a próxima versão do VRaptor. As modificações serão baseadas em um plugin chamado nice-urls que já estamos usando a bastante tempo internamente.

    Você sabe que sou um ativista de Ruby e JRuby. ADOREI o RSpec::VRaptor. Podemos ver de transformá-lo em um plugin e distribuir junto da versão oficial do VRaptor, o que acha?

    A forma recomendada no site do vraptor para testes vale para a criação de testes unitários, onde você não quer testar o framework e a injeção junto da funcionalidade dos seus controladores. Já até teve algumas classes “utilitárias” para ajudar os testes em algumas versões iniciais do VRaptor, mas resolvemos tirar tudo e deixar cada um usar o que quiser para criar Mocks do que fosse preciso.

    Mesmo assim, o seu RSpec::VRaptor é uma forma excelente de criar testes de integração/funcionais. Muito bom!

  • 2 Diego Carrion // jan 28, 2009 at 2:35 pm

    Antes de mais nada, obrigado Fábio! Teu comentário vai dar credibilidade ao projeto.

    Me parece excelente a idéia de distribuir o RSpec::VRaptor junta com a versão oficial como um plugin. Nos tempninhos livres vou ir mexendo um pouco o código para adaptalo a trabalhar com a servlet do VRaptor e também estou precissando por algumas validações a mais, como ‘should render’.

    Valeu pela força :)

  • 3 Jimmy // jan 28, 2009 at 3:18 pm

    Diego, primeiramente parabéns.
    O VRaptor que é um framework sensacional e ficou melhor ainda com estas melhorias.

    Além de tudo, isto prova que conhecer novas tecnologias como Ruby ajuda muito na nossa maneira de desenvolver e enxergar além de algumas possiveis limitações.

    Vamos aguardar agora para que o RSpec::VRaptor seja distribuido com a versão oficial!

Deixar um comentário