Configurar RSpec para probar una gema (no Rails)


Es bastante fácil con el generador añadido de rspec-rails configurar RSpec para probar una aplicación Rails. Pero, ¿qué tal agregar RSpec para probar una gema en desarrollo? No estoy usando joyero o tales herramientas. Acabo de usar Bundler (bundle gem my_gem) para configurar la estructura de la nueva gema y editar el *.gemspec manualmente. También agregué s.add_development_dependency "rspec", ">= 2.0.0" a gemspec e hice un bundle install.

¿Hay algún buen tutorial qué hacer a continuación para que RSpec funcione?

Author: Zardoz, 2010-12-09

4 answers

He actualizado esta respuesta para que coincida con las mejores prácticas actuales:

Bundler soporta perfectamente el desarrollo de gemas. Si estás creando una gema, lo único que necesitas tener en tu Gemfile es lo siguiente:

source "https://rubygems.org"
gemspec

Esto le dice a Bundler que busque dentro de su archivo gemspec las dependencias cuando ejecute bundle install.

A continuación, asegúrese de que RSpec es una dependencia de desarrollo de su gema. Edite el gemspec para que diga:

spec.add_development_dependency "rspec"

A continuación, crear spec/spec_helper.rb y añade algo como:

require 'bundler/setup'
Bundler.setup

require 'your_gem_name' # and any other gems you need

RSpec.configure do |config|
  # some (optional) config here
end

Las dos primeras líneas le dicen a Bundler que cargue solo las gemas dentro de su gemspec. Cuando instale su propia gema en su propia máquina, esto obligará a sus especificaciones a usar su código actual, no la versión que ha instalado por separado.

Cree una especificación, por ejemplo spec/foobar_spec.rb:

require 'spec_helper'
describe Foobar do
  pending "write it"
end

Opcional: agregue un archivo .rspec para las opciones predeterminadas y colóquelo en la ruta raíz de su gema:

--color
--format documentation

Finalmente: ejecute las especificaciones:

$ rspec spec/foobar_spec.rb
 242
Author: iain,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-02 19:13:19

La solución de Iain anterior funciona muy bien!

Si también quieres un Rakefile, esto es todo lo que necesitas:

require 'rspec/core/rake_task'

RSpec::Core::RakeTask.new(:spec)

# If you want to make this the default task
task default: :spec

Compruebe el RDoc para RakeTask para varias opciones que puede pasar opcionalmente a la definición de la tarea.

 50
Author: Mirko Froehlich,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-23 22:44:14

Puede generar su nueva gema con rspec ejecutando bundler gem --test=rspec my_gem. No hay configuración adicional!

Siempre olvido esto. Se implementa aquí: https://github.com/bundler/bundler/blob/33d2f67d56fe8bf00b0189c26125d27527ef1516/lib/bundler/cli/gem.rb#L36

 24
Author: StevenNunez,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-04-25 13:16:36

Aquí hay una manera barata y fácil (aunque no se recomienda oficialmente):

Haga un dir en la raíz de su gema llamado spec, ponga sus especificaciones allí. Probablemente ya tenga instalado rspec, pero si no lo tiene, simplemente haga un gem install rspec y olvídese de Gemfiles y bundler.

A continuación, harás una especificación, y necesitas indicarle dónde está tu aplicación, dónde están tus archivos e incluir el archivo que deseas probar (junto con cualquier dependencia que tenga):

# spec/awesome_gem/awesome.rb
APP_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..', '..'))
$: << File.join(APP_ROOT, 'lib/awesome_gem') # so rspec knows where your file could be
require 'some_file_in_the_above_dir' # this loads the class you want to test

describe AwesomeGem::Awesome do
  before do
    @dog = AwesomeGem::Awesome.new(name: 'woofer!')
  end
  it 'should have a name' do
    @dog.name.should eq 'woofer!'
  end
  context '#lick_things' do
    it 'should return the dog\'s name in a string' do
      @dog.lick_things.should include 'woofer!:'
    end
  end
end

Abra la terminal y ejecute rspec:

~/awesome_gem $ rspec
..

Finished in 0.56 seconds
2 examples, 0 failures

Si quieres algunas opciones de .rspec love, ve a crear un archivo .rspec y ponlo en la ruta raíz de tu gema. El mío se ve así:

# .rspec
--format documentation --color --debug --fail-fast

, Fácil, rápido, limpio!

Me gusta esto porque no tienes que añadir ninguna dependencia a tu proyecto, y todo sigue siendo muy rápido. bundle exec ralentiza un poco las cosas, que es lo que tendría que hacer para asegurarse de que está utilizando la misma versión de rspec todo el tiempo. Que 0.56 segundos tomó para ejecutar dos pruebas fue 99% ocupado por el tiempo que tomó mi computadora para cargar rspec. Ejecutar cientos de especificaciones debería ser extremadamente rápido. El único problema que podría encontrar que estoy al tanto es que si cambia las versiones de rspec y la nueva versión no es compatible con algunas funciones que utilizó en su prueba, es posible que tenga que volver a escribir algunas pruebas.

Esto es bueno si está haciendo especificaciones únicas o tiene alguna buena razón para NO incluir rspec en su gemspec, sin embargo, no es muy bueno para permitir compartir o hacer cumplir la compatibilidad.

 6
Author: wulftone,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-26 21:12:03