tests test run rails matchers how example testing rubygems rspec gem rspec2

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.