web-dev-qa-db-fra.com

Configurez RSpec pour tester une gemme (pas Rails)

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?

152
Zardoz

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
248
iain

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.

53
Mirko Froehlich

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

25
StevenNunez

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é.

6
wulftone