Il est assez facile avec le générateur ajouté de rspec-Rails de configurer RSpec pour tester une application Rails. Mais pourquoi ne pas ajouter RSpec pour tester une gem en développement? Je n'utilise pas de bijoutier ni de tels outils . Je viens d’utiliser Bundler (bundle gem my_gem
) pour configurer la structure de la nouvelle gemme et éditer le * .gemspec manuellement. J'ai aussi ajouté s.add_development_dependency "rspec", ">= 2.0.0"
à Gemspec et a fait un bundle install
.
Existe-t-il un bon tutoriel sur ce qu'il faut faire ensuite pour que RSpec fonctionne?
J'ai mis à jour cette réponse pour correspondre aux meilleures pratiques actuelles:
Bundler soutient parfaitement le développement des pierres précieuses. Si vous créez une gemme, la chose seulement que vous devez avoir dans votre Gemfile est la suivante:
source "https://rubygems.org"
gemspec
Ceci dit à Bundler de chercher dans votre fichier gemspec les dépendances lorsque vous exécutez bundle install
.
Ensuite, assurez-vous que RSpec dépend du développement de votre bijou. Editez le gemspec pour qu'il se lise:
spec.add_development_dependency "rspec"
Ensuite, créez spec/spec_helper.rb
et ajoutez quelque chose comme:
require 'bundler/setup'
Bundler.setup
require 'your_gem_name' # and any other gems you need
RSpec.configure do |config|
# some (optional) config here
end
Les deux premières lignes indiquent à Bundler de ne charger que les gemmes à l'intérieur de votre gemspec. Lorsque vous installez votre propre bijou sur votre propre ordinateur, vos spécifications seront forcées d'utiliser votre code actuel, et non la version que vous avez installée séparément.
Créez une spécification, par exemple spec/foobar_spec.rb
:
require 'spec_helper'
describe Foobar do
pending "write it"
end
Facultatif: ajoutez un .rspec
fichier pour les options par défaut et le placer dans le chemin racine de votre gem:
--color
--format documentation
Enfin: lancez les spécifications:
$ rspec spec/foobar_spec.rb
La solution d'Iain ci-dessus fonctionne très bien!
Si vous voulez aussi un fichier Rake, c'est tout ce dont vous avez besoin:
require 'rspec/core/rake_task'
RSpec::Core::RakeTask.new(:spec)
# If you want to make this the default task
task default: :spec
Recherchez dans le RDoc RakeTask les différentes options que vous pouvez éventuellement transmettre à la définition de la tâche.
Vous pouvez générer votre nouveau joyau avec rspec en lançant bundler gem --test=rspec my_gem
. Aucune configuration supplémentaire!
J'oublie toujours ça. C'est mis en œuvre ici: https://github.com/bundler/bundler/blob/33d2f67d56fe8bf00b0189c26125d27527ef1516/lib/bundler/cli/gem.rb#L36
Voici un moyen facile et peu coûteux (bien que non officiellement recommandé):
Créez un répertoire dans la racine de votre gemme appelé spec
, mettez-y vos spécifications. Vous avez probablement déjà installé rspec, mais si vous ne le faites pas, faites simplement un gem install rspec
et oubliez Gemfiles et bundler.
Ensuite, vous allez faire une spécification, et vous devez lui indiquer où se trouve votre application, où se trouvent vos fichiers, et inclure le fichier que vous voulez tester (ainsi que toutes ses dépendances):
# 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
Ouvrez le terminal et lancez rspec:
~/awesome_gem $ rspec
..
Finished in 0.56 seconds
2 examples, 0 failures
Si tu veux du .rspec
options love, va faire un .rspec
fichier et placez-le dans le chemin racine de votre gemme. Le mien ressemble à ceci:
# .rspec
--format documentation --color --debug --fail-fast
Facile, rapide, soigné!
J'aime ça parce que vous n'avez pas besoin d'ajouter de dépendances à votre projet, et le tout reste très rapide. bundle exec
ralentit un peu les choses, ce que vous devez faire pour vous assurer que vous utilisez la même version de rspec tout le temps. Les 0,56 secondes nécessaires à l'exécution de deux tests ont été utilisés à 99% par le temps qu'il a fallu à mon ordinateur pour charger rspec. Exécuter des centaines de spécifications devrait être extrêmement rapide. À ma connaissance, le seul problème que vous pourriez rencontrer est le suivant: si vous changez de version de rspec et que la nouvelle version n'est pas rétrocompatible avec certaines fonctions utilisées dans votre test, vous devrez peut-être réécrire certains tests.
C'est bien si vous définissez des spécifications uniques ou si vous avez une bonne raison de NE PAS inclure rspec dans votre gemspec, mais ce n'est pas très efficace pour permettre le partage ou l'application de la compatibilité.