Configura RSpec per testare un gioiello (non Rails)


154

È abbastanza facile con il generatore aggiunto di rspec-rails configurare RSpec per testare un'applicazione Rails. Ma che ne dici di aggiungere RSpec per testare un gioiello in fase di sviluppo? Non sto usando gioielliere o strumenti simili. Ho appena usato Bundler ( bundle gem my_gem) per impostare la struttura per la nuova gemma e modificare manualmente * .gemspec. Ho anche aggiunto s.add_development_dependency "rspec", ">= 2.0.0"a gemspec e ho fatto un bundle install.

C'è qualche bel tutorial su cosa fare dopo per far funzionare RSpec?


Immagino di doverne scrivere una :-) ... Almeno ci sono due gemme che già la integrano bene: act-as-taggable-on e act_as_geocodable.
Zardoz,

Risposte:


255

Ho aggiornato questa risposta per abbinare le migliori pratiche attuali:

Bundler supporta perfettamente lo sviluppo delle gemme. Se stai creando una gemma, l' unica cosa che devi avere nel tuo Gemfile è la seguente:

source "https://rubygems.org"
gemspec

Questo dice a Bundler di cercare nel tuo file gemspec le dipendenze quando esegui bundle install.

Successivamente, assicurati che RSpec sia una dipendenza dallo sviluppo del tuo gioiello. Modifica il gemspec in modo che legga:

spec.add_development_dependency "rspec"

Quindi, crea spec/spec_helper.rbe aggiungi qualcosa di simile:

require 'bundler/setup'
Bundler.setup

require 'your_gem_name' # and any other gems you need

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

Le prime due righe indicano a Bundler di caricare solo le gemme all'interno del tuo gemspec. Quando installi la tua gemma sul tuo computer, questo costringerà le tue specifiche a usare il tuo codice attuale, non la versione che hai installato separatamente.

Crea una specifica, ad esempio spec/foobar_spec.rb:

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

Opzionale: aggiungi un .rspecfile per le opzioni predefinite e inseriscilo nel percorso radice della tua gemma:

--color
--format documentation

Infine: esegui le specifiche:

$ rspec spec/foobar_spec.rb

75
Per essere onesti, dovresti invece invocare il comando init di RSpec per generare i file skeleton spec invece di doverli digitare manualmente. Ciò garantirebbe la compatibilità con la versione di RSpec che stai usando: rspec --init
Attila Györffy

12
rspec --initnon era disponibile quando ho scritto questo, ma un buon punto!
Iain

In realtà ho trovato il modo migliore per eseguire i requisiti nell'helper delle specifiche è questo: richiedere 'rubygems' richiedere 'bundler / setup' Bundler.require (: default
,:

Come funzionano esattamente le tre righe di codice di @mkon in modo diverso dalle tre righe di codice di iain?
Nakilon,

1
Le linee di @mkon richiederanno tutte le gemme nei gruppi di sviluppo e test, mentre il mio approccio è quello di richiedere manualmente ogni gemma. Dal momento che è necessario richiedere ogni gemma da soli quando si creano gemme, penso che sia l'approccio migliore / più chiaro anche se potrebbe essere un po 'più di lavoro.
Iain

53

La soluzione di Iain sopra funziona alla grande!

Se vuoi anche un Rakefile, questo è tutto ciò che ti serve:

require 'rspec/core/rake_task'

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

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

Controllare RDoc per RakeTask per varie opzioni che è possibile facoltativamente passare nella definizione dell'attività .


26

Puoi generare la tua nuova gemma con rspec eseguendo bundler gem --test=rspec my_gem. Nessuna installazione aggiuntiva!

Lo dimentico sempre. È implementato qui: https://github.com/bundler/bundler/blob/33d2f67d56fe8bf00b0189c26125d27527ef1516/lib/bundler/cli/gem.rb#L36


1
! Neat Tuttavia, penso che il nome della tua gemma debba essere specificato con caratteri di sottolineatura invece che con custodia di cammello. Altrimenti Bundler crea file con lettere maiuscole (Bundler 1.7.4)
Malte

Bundler si è lamentato --test=rspec, ma mi chiedeva ancora se volevo usare Rspec mentre correvo bundler gem my_gem.
Nicolas Mattia,

7

Ecco un modo economico e semplice (anche se non ufficialmente consigliato):

Crea un dir nella radice della tua gemma chiamato spec, inserisci le tue specifiche. Probabilmente hai già installato rspec, ma se non lo fai, basta fare un gem install rspece dimenticare Gemfile e bundler.

Successivamente, farai una specifica e dovrai dirlo dove si trova la tua app, dove sono i tuoi file e includere il file che vuoi testare (insieme a tutte le dipendenze che ha):

# 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

Apri Terminal ed esegui rspec:

~/awesome_gem $ rspec
..

Finished in 0.56 seconds
2 examples, 0 failures

Se vuoi che alcune .rspecopzioni ti piacciano, vai a fare un .rspecfile e mettilo nel percorso di root della tua gemma. Il mio assomiglia a questo:

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

Facile, veloce, pulito!

Mi piace perché non devi assolutamente aggiungere dipendenze al tuo progetto e il tutto rimane molto velocemente. bundle execrallenta un po 'le cose, che è quello che dovresti fare per assicurarti di usare sempre la stessa versione di rspec. Gli 0,56 secondi necessari per eseguire due test sono stati assorbiti al 99% dal tempo impiegato dal mio computer per caricare rspec. Eseguire centinaia di specifiche dovrebbe essere estremamente veloce. L'unico problema che potresti riscontrare di cui sono a conoscenza è che se cambi le versioni di rspec e la nuova versione non è retrocompatibile con alcune funzioni che hai usato nel tuo test, potresti dover riscrivere alcuni test.

Questo è bello se stai facendo specifiche una tantum o hai qualche buon motivo per NON includere rspec nel tuo gemspec, tuttavia non è molto buono per consentire la condivisione o l'applicazione della compatibilità.


C'è un modo per non mettere AwesomeGem :: prima dei nomi delle classi ogni volta che fai riferimento a un oggetto test? O quando crei un nuovo test come nel tuo esempio.
Misha Slyusarev,

1
Certo, puoi impostare il nome della tua classe uguale a qualcosa di più corto, come Thing = AwesomeGem::Awesomeo puoi fare il test all'interno di un modulo, comemodule AwesomeGem; it 'stuff' do; Awesome.new ... end; end
wulftone
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.