Go to English Blog

Usando o Jasmine no Rails

Leia em 2 minutos

No último artigo mostrei como configurar o Rails e RSpec para executar testes de integração com JavaScript. Embora testes de integração sejam importantes, eles não invalidam os testes unitários. Então, agora é hora de ver como configurar o Rails com suporte ao Jasmine.

Configurando o Rails

Primeiro, instale adicione a gem jasmine ao seu arquivo Gemfile.

group :test, :development do
  gem 'jasmine'
end

Depois de executar o comando bundle install, execute o generator jasmine:install para criar a estrutura inicial.

$ rails g jasmine:install
  exist  spec
  create  spec/javascripts/helpers/.gitkeep
  create  spec/javascripts/support/jasmine.yml
  create  spec/javascripts/support/jasmine_helper.rb

Escrevendo testes

Você pode adicionar os testes de JavaScript no diretório spec/javascripts. Eu normalmente tenho um diretório com o nome da aplicação, então neste caso vamos criar o arquivo spec/javascripts/myapp/hello_spec.js.

describe('Hello from Jasmine', function(){
  it('passes', function(){
    expect(true).toBeTruthy();
  });
});

Para executar seus testes, você tem duas alternativas. A primeira é levantar um servidor local com o comando rake jasmine, disponível em http://localhost:8888.

Servidor de testes do Jasmine

A segunda alternativa é executar os testes no terminal com o Phantom.js. Para isso, basta executar o comando rake jasmine:ci.

$ rake jasmine:ci
Waiting for jasmine server on 55226...
Waiting for jasmine server on 55226...
[2014-07-15 14:13:40] INFO  WEBrick 1.3.1
[2014-07-15 14:13:40] INFO  ruby 2.1.2 (2014-05-08) [x86_64-darwin13.0]
[2014-07-15 14:13:40] INFO  WEBrick::HTTPServer#start: pid=94774 port=55226
Waiting for jasmine server on 55226...
jasmine server started.
.

1 spec, 0 failures
[2014-07-15 14:13:42] INFO  going to shutdown ...
[2014-07-15 14:13:42] INFO  WEBrick::HTTPServer#start done.

Se você quiser executar tanto os testes do RSpec, quanto os do Jasmine, você pode criar uma rake task que adiciona o Jasmine na tarefa :default. Crie um arquivo lib/tasks/default.rake com o conteúdo abaixo:

task :default => :'jasmine:ci'

Agora, basta execute o comando rake.

$ rake
/usr/local/Cellar/ruby/2.1.2_2/bin/ruby -I/Users/fnando/local/ruby/gems/gems/rspec-core-3.0.2/lib:/Users/fnando/local/ruby/gems/gems/rspec-support-3.0.2/lib -S /Users/fnando/local/ruby/gems/gems/rspec-core-3.0.2/exe/rspec ./spec/features/hello_js_spec.rb ./spec/lib/sample_spec.rb
..

Finished in 2.58 seconds (files took 1.25 seconds to load)
2 examples, 0 failures
[2014-07-15 14:22:34] INFO  WEBrick 1.3.1
[2014-07-15 14:22:34] INFO  ruby 2.1.2 (2014-05-08) [x86_64-darwin13.0]
[2014-07-15 14:22:34] INFO  WEBrick::HTTPServer#start: pid=95636 port=55503
Waiting for jasmine server on 55503...
jasmine server started.
.

1 spec, 0 failures
[2014-07-15 14:22:35] INFO  going to shutdown ...
[2014-07-15 14:22:35] INFO  WEBrick::HTTPServer#start done.

A gem jasmine tem suporte para o asset pipeline. Imagine que você irá usar a biblioteca jasmine-fixture. Assumindo que ela está no seu projeto (eu uso Bower para isso), você pode simplesmente carregar essa dependência em um arquivo de helper. Crie o arquivo spec/javascripts/helpers/spec_helper.js com o seguinte conteúdo:

//= require es5-shim
//= require jquery
//= require jasmine-fixture

function fixture() {
  var container = $('<div>');

  [].slice.call(arguments).forEach(function(selector){
    container.affix(selector);
  });

  return container;
}

As chamadas para es5-shim e jquery provavelmente estarão em seu arquivo app/assets/javascripts/application.js ou equivalente.

Com a biblioteca jasmine-fixture pode criar fixtures de uma maneira muito simples; basta especificar o seu seletor que ele se encarrega de criar toda a estrutura. Veja o exemplo abaixo:

it('uses fixture', function(){
  var container = fixture('.box > input[type="button"][value="Click me!"]');
  expect(container.find('.box > input').val()).toEqual('Click me!');
});

Preprocessadores

Se você gosta de CoffeeScript e afins, terá que usar a gem jasmine-rails, que funciona de forma muito parecida, mas que ainda permite escrever os testes usando o seu preprocessador favorito.

Para mais informações, veja a documentação do projeto.

Finalizando

Escrever testes que envolvem JavaScript no Rails é uma tarefa muito simples. Se você ainda não escrevia testes para garantir que seu front-end funciona corretamente, agora não tem mais desculpa!