2009-06-12 3 views
10

Aggiungo ulteriori test rspec alla mia app e vorrei testare un modulo ScoringMethods, che si trova in /lib/scoring_methods.rb. Così ho aggiunto una directory/spec/lib e ho aggiunto scoring_methods_spec.rb lì. Ho richiesto spec_helper e impostare il blocco definirei così:L'aggiunta del test rspec per il modulo libreria non sembra prendere in considerazione Aspettative e Matchers

require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') 

describe ScoringMethods do 

    describe "should have scorePublicContest method" do 
    methods = ScoringMethods.instance_methods 
    methods[0].should match(/scorePublicContest/) 
    end 
end 

Ora methods[0] è una stringa e non c'è nessun problema che corrisponde al nome del metodo pubblico con l'espressione regolare. E il percorso relativo a "spec_helper" è corretto.

Il problema è che l'intera installazione non sembra utilizzare la libreria rspec. eseguire l'esempio rendimenti:

./spec/lib/scoring_methods_spec.rb:7: undefined method `match' for Spec::Rails::Example::RailsExampleGroup::Subclass_1::Subclass_1:Class (NoMethodError) 
    ... 

L'intero attesa e di supporto Matcher sembra mancare. Per testare le mie supposizioni, ho modificato una specifica di helper funzionante sostituendo "is_instance_of" a "is_foobar_of". Quel test semplicemente fallisce e dice "is_foobar_of" non è un metodo dell'oggetto mirato; che questa intera gerarchia Spec :: Rails :: Example ... non sia presente.

Ho provato a utilizzare anche altri dispositivi di abbinamento. Ho provato "be_instance_of" e alcuni altri. Sembra che non includa correttamente la libreria rspec.

Infine, ScoringMethods è un modulo, proprio come gli Helpers sono moduli. Quindi ho pensato che sarebbe stato possibile testare un modulo (al contrario delle classi, come Controller e Modelli).

Apprezzerei molto i tuoi pensieri su ciò che ho fatto di sbagliato. Forse c'è un modo più efficace di testare i moduli di libreria? Grazie!

risposta

11

È necessario includere il blocco di prova in un blocco "it". Per esempio:

require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') 

describe ScoringMethods do 

    describe "should have scorePublicContest method" do 
    it "should have a scorePublicContest method" do 
     methods = ScoringMethods.instance_methods 
     methods[0].should match(/scorePublicContest/) 
    end 
    end 
end 

Troverete che i nomi metodi restituiti non sono garantiti per essere nell'ordine in cui sono presenti nel file.

Un modello che utilizziamo spesso durante il test dei moduli consiste nell'includere il modulo in una classe creata per il test (all'interno del file delle specifiche) o inclusa all'interno della specifica stessa.

+1

Mark, Grazie mille per aver risposto. Hai assolutamente ragione! Non avevo il blocco "it". Molte grazie, Peter –

+2

Inoltre, grazie per i vostri pensieri sui moduli di test. Il modulo è incluso in una classe per esporre solo i suoi metodi pubblici e non ottenere un elenco enorme di metodi restituiti quando si utilizza la chiamata instance_methods. In questo modo, possiamo aggiungere nuovi metodi pubblici al modulo e sono disponibili per la selezione in elenchi a discesa e simili. Utilizzare lo stesso meccanismo, come suggerito, sarà utile per il test. –

+0

Impressionante, inoltre, non aveva chiuso correttamente il blocco 'it'. –