testing - test - shoulda matchers
Configurar RSpec para probar una gema(no rieles) (4)
Es bastante fácil con el generador agregado de rspec-rails para configurar RSpec para probar una aplicación de Rails. ¿Pero qué hay de agregar RSpec para probar una gema en desarrollo? No estoy usando joyero ni esas herramientas. Acabo de usar Bundler ( bundle gem my_gem
) para configurar la estructura de la nueva gema y editar manualmente * .gemspec. También agregué s.add_development_dependency "rspec", ">= 2.0.0"
a gemspec e hice un bundle install
.
¿Hay algún buen tutorial sobre qué hacer para que RSpec funcione?
Actualicé esta respuesta para que coincida con las mejores prácticas actuales:
Bundler apoya el desarrollo de gemas perfectamente. Si está creando una gema, lo único que necesita tener en su Gemfile es la siguiente:
source "https://rubygems.org"
gemspec
Esto le dice a Bundler que busque dentro de su archivo gemspec las dependencias cuando ejecuta la bundle install
.
A continuación, asegúrese de que RSpec sea una dependencia de desarrollo de su gema. Edite el gemspec para que lea:
spec.add_development_dependency "rspec"
A continuación, cree spec/spec_helper.rb
y agregue 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 primeras dos líneas le dicen a Bundler que solo cargue las gemas dentro de tu gemspec. Cuando instala su propia joya en su propia máquina, esto obligará a sus especificaciones a usar su código actual, no la versión que haya 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 póngalo en la ruta raíz de su gema:
--color
--format documentation
Finalmente: ejecuta las especificaciones:
$ rspec spec/foobar_spec.rb
Esta es una forma barata y fácil (aunque no recomendada oficialmente):
Haz un directorio en la raíz de tu gema llamada spec
, pon tus especificaciones allí. Probablemente ya tengas instalado rspec, pero si no lo haces, simplemente haz una gem install rspec
y olvida Gemfiles y bundler.
A continuación, creará una especificación, y deberá indicar dónde está su aplicación, dónde se encuentran sus archivos e incluir el archivo que desea probar (junto con las dependencias 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 amor por algunas opciones .rspec
, ve a hacer un archivo .rspec
y ponlo en la ruta raíz de tu joya. El mío se ve así:
# .rspec
--format documentation --color --debug --fail-fast
¡Fácil, rápido, limpio!
Me gusta esto porque no tiene que agregar dependencias a su proyecto en absoluto, y todo sigue siendo muy rápido. bundle exec
ralentiza un poco las cosas, que es lo que tendrías que hacer para asegurarte de estar usando la misma versión de rspec todo el tiempo. Los 0,56 segundos que tardó en ejecutar dos pruebas se habían agotado en un 99% cuando mi computadora necesitó cargar rspec. Ejecutar cientos de especificaciones debe ser extremadamente rápido. El único problema con el que podría encontrarse 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 deba 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.
La solución de Iain de arriba 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
Consulte el RakeTask para RakeTask para ver las diversas opciones que puede pasar opcionalmente a la definición de la tarea.
Puedes generar tu nueva gema con rspec ejecutando bundler gem --test=rspec my_gem
. ¡Sin configuración adicional!
Siempre me olvido de esto. Se implementa aquí: https://github.com/bundler/bundler/blob/33d2f67d56fe8bf00b0189c26125d27527ef1516/lib/bundler/cli/gem.rb#L36