2013-01-16 6 views
8

sto usando rspec 1.3.2 per testare un'azione di controllo che sembra qualcosa di simile:stub una variabile di istanza all'interno del controller

def action_foo 
    ... 
    @bar.can_do_something? 
    ... 
end 

Sto cercando di stub @bar (assumere è un'istanza della classe Bar) variabile di istanza ma non riesco a. Penso che se avessi accesso a any_instance allora potrei fare Bar.any_instance.stub(:can_do_something?) ma che non è disponibile nella versione di rspec che sto usando.

C'è un altro modo per accedere e stub @bar? Nessuno dei seguenti ha lavorato:

@bar.stub(:can_do_something?) 
controller.instance_variable_get("@bar").stub(:can_do_something?) 
controller.stub_chain(:bar, :can_do_something?) 
Bar.new.stub(:can_do_something?) 

Edit:

@bar viene assegnato in un before_filter. qualcosa come @bar = Bar.find(n)

+0

Dove/come si '@ bar' istanziato? –

+0

'@ bar' è assegnato in un' before_filter' – Dty

risposta

3

Per la cronaca, questo è un po 'più pulito penso:

bar = Bar.new # or use FactoryGirl to create a Bar factory 
bar.stub(:can_do_something?) { # return something } 
controller.instance_variable_set(:@bar, bar) 
1
Bar.any_instance.stub(:can_do_something?) 
+0

ok, come si ottiene @bar allora? – apneadiving

+0

'@ bar' è assegnato in un' before_filter' – Dty

+0

come? una query db? – apneadiving

1

Se tutto questo non si potrebbe fare qualcosa di simile a any_instance.stub. Per la cronaca, questo mi fa sentire sporco.

Bar.class_eval do 
    alias :original_can_do_something? :can_do_something? 

    def can_do_something? # "stub" method 
    # Return whatever you need here 
    end 
end 

# Run your test 

Bar.class_eval do 
    alias :can_do_something? :original_can_do_something? # "unstub" the method 
end 
+0

non sto andando con questa soluzione ma accetto la tua risposta dato che è l'unica che ha risposto alla mia domanda – Dty