Setup do Sunspot-rails no Rspec

{ June 23rd, 2010 }


cmilfont

Autor: cmilfont

Tínhamos um problema nos testes unitários por débito técnico [na verdade desleixo mesmo] com o setup do Rspec e Sunspot-rails em determinado projeto. O problema era que mesmo para executar um simples teste unitário, levantávamos o Sunspot no spec_helper.rb.

Resolvi refatorar isso, acabei descobrindo no before/after do Spec::Runner.configure algo que eu n√£o usava e que j√° existia desde o rspec “1.1.12 / 2009-01-11”, pelo que percebi no changelog.

O que fiz e parece bobo é separar pelo tipo (type) integration a subida de uma instancia real do Sunspot e agora dá para usar a estrutura de Rspec que o Sunspot disponibiliza para meus testes unitários.

#arquivo spec_helper.rb
ENV["RAILS_ENV"] ||= 'test'
require File.expand_path(File.join(File.dirname(__FILE__),'..','config','environment'))
require 'spec/autorun'
require 'spec/rails'
require 'rake'
require 'ruby-debug' unless RUBY_VERSION > '1.9'
require 'sunspot/rails/tasks'
require 'authlogic/test_case'
require 'sunspot/rails/spec_helper'
require 'database_cleaner'
#observe aqui que eu criei uma pasta support porque guardo algumas confs em arquivos contidos nela
Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
Spec::Runner.configure do |config|
config.use_transactional_fixtures = true
config.use_instantiated_fixtures = false
config.fixture_path = RAILS_ROOT + '/spec/fixtures/'
config.before(:suite) do
DatabaseCleaner.strategy = :truncation
DatabaseCleaner.clean_with(:truncation)
end
config.before(:each) do
DatabaseCleaner.start
end
config.after(:each) do
DatabaseCleaner.clean
end
[:model, :helper, :controller].each {|type|
config.before(:each, :type => type) do
::Sunspot.session = ::Sunspot::Rails::StubSessionProxy.new(::Sunspot.session)
end
config.after(:each, :type => type) do
::Sunspot.session = ::Sunspot.session.original_session
end
}
config.before(:all, :type => :integration) do
JojobaSunspot.new.start
end
config.after(:suite) do
JojobaSunspot.new.stop
end
end
view raw gistfile1.builder hosted with ❤ by GitHub

Inspirado nesse post, eu adaptei para o c√≥digo que uso ao subir o sunspot com linha de comando para os testes de integra√ß√£o. Observe no c√≥digo anterior que importo configura√ß√Ķes da pasta support, inclusive a classe JojobaSunspot, usada no after e before de integration.

require "net/http"
class JojobaSunspot
def start
@started = Time.now
up_sunspot if starting
up
end
def stop
system("sunspot-solr stop --pid-dir=/tmp/pids") unless starting
end
private
def port
Sunspot::Rails::Server.new.port
end
def up_sunspot
system("sunspot-solr start -p 8981 -d /tmp/solr_data_test --pid-dir=/tmp/pids --log-file=/tmp/solr_log_test.log --log-level=INFO")
end
def up
while starting
puts "Sunspot server is starting..."
end
puts "Sunspot server took #{'%.2f' % (Time.now - @started)} sec. to get up and running. Let's Jojoba!"
end
def starting
begin
sleep(1)
request = Net::HTTP.get_response(URI.parse("http://localhost:#{port}/solr/"))
false
rescue Errno::ECONNREFUSED
true
end
end
end
view raw gistfile1.builder hosted with ❤ by GitHub

Desde que colocamos testes de integração o tempo de execução da bateria subiu muito, provocamos um setup ineficiente e desnecessário para os testes unitários. Fica a dica para quem passar pelo mesmo problema.

Categories: Rails, Rspec, Ruby, Sunspot ~ ~ Trackback


Assine os coment√°rios deste artigo.


One Response to “Setup do Sunspot-rails no Rspec”

  1. 1
    Tweets that mention Milfont.org Ultrapassando os limites da WEB -- Topsy.com

    […] This post was mentioned on Twitter by cmilfont, Rafael Ponte. Rafael Ponte said: RT: @cmilfont: Eu n√£o conhecia o :type no setup before/after do Rspec http://www.milfont.org/tech/2010/06/23/setup-sunspot-e-rspec/ […]

Leave a Reply