2014-11-05 6 views
6

Ho una classe che simile a questa:Come interrompere una relazione di record attiva per testare una clausola where con rspec?

class Foo < ActiveRecrod::Base 
    has_many :bars 

    def nasty_bars_present? 
    bars.where(bar_type: "Nasty").any? 
    end 

    validate :validate_nasty_bars 
    def validate_nasty_bars 
    if nasty_bars_present? 
     errors.add(:base, :nasty_bars_present) 
    end 
    end 
end 

Nel testare il #nasty_bars_present? Mi piacerebbe scrivere un test rspec che blocca l'associazione delle barre, ma consente il modo in cui eseguire in modo naturale. Qualcosa di simile:

describe "#nasty_bars_present?" do 
    context "with nasty bars" do 
    before { foo.stub(:bars).and_return([mock(Bar, bar_type: "Nasty")]) } 
    it "should return true" do 
     expect(foo.nasty_bars_present?).to be_true 
    end 
    end 
end 

Il test precedente dà un errore sul fatto che non esiste un metodo per un array. Come posso avvolgere il mock in modo che il punto esatto venga eseguito correttamente?

Grazie!

+0

Quale versione di RSpec stai usando? – nikkon226

+0

Questo progetto è su 2.14.1, ma sarei interessato anche all'esecuzione della versione più recente. – biagidp

risposta

3

Per RSpec 2.14.1 (dovrebbe funzionare anche per RSpec 3.1), vorrei provare questo:

describe "#nasty_bars_present?" do 
    context "with nasty bars" do 
    before :each do 
     foo = Foo.new 
     bar = double("Bar") 
     allow(bar).to receive(:where).with({bar_type: "Nasty"}).and_return([double("Bar", bar_type: "Nasty")]) 
     allow(foo).to receive(:bars).and_return(bar) 
    end 
    it "should return true" do 
     expect(foo.nasty_bars_present?).to be_true 
    end 
    end 
end 

In questo modo, se si chiama bars.where(bar_type: "Nasty") senza le condizioni specifiche in cui la dichiarazione, hai vinto' t ottenere il doppio della barra con bar_type: "Nasty". Potrebbe essere riutilizzabile per il futuro derisione delle barre (almeno per restituire una singola istanza, per più istanze, aggiungerebbe un altro doppio).

+0

non dovrebbe 'double ('Bar')' be 'class_double ('Bar')'? –

Problemi correlati