2012-07-03 3 views
1

Рассмотрим следующие два тривиальных модели:Должен ли я сделать что-то, чего я не ожидаю?

class Iq 

    def score 
    #Some Irrelevant Code 
    end 

end 

class Person 

    def iq_score 
    Iq.new(self).score #error here 
    end 

end 

И следующий тест RSpec:

describe "#iq_score" do 

    let(:person) { Person.new } 

    it "creates an instance of Iq with the person" do 
    Iq.should_receive(:new).with(person) 
    Iq.any_instance.stub(:score).and_return(100.0) 
    person.iq_score 
    end 

end 

Когда я запускаю этот тест (или, вернее, аналогичный один), он появляется заглушка имеет не работает:

Failure/Error: person.iq_score 
    NoMethodError: 
    undefined method `iq_score' for nil:NilClass 

Ошибка, как вы можете догадаться, находится на линии с надписью «error here» выше. Когда строка should_receive закомментирована, эта ошибка исчезает. Что происходит?

+0

Вы пытались удалить метод 'with' или добавить метод' and_return'? –

+0

Удаление вызова 'with' не влияет. Что я буду использовать в качестве аргумента для 'и return', учитывая, что экземпляр' Iq' еще не создан? – hoffm

+0

mock_model (Iq) .as_null_object –

ответ

3

Вы гася прочь инициализатору:

Iq.should_receive(:new).with(person) 

возвращает NIL, так Iq.new равна нулю. Чтобы исправить, просто сделать это:

Iq.should_receive(:new).with(person).and_return(mock('iq', :iq_score => 34)) 
person.iq_score.should == 34 // assert it is really the mock you get 
7

Поскольку RSpec расширило функциональные возможности stubber, теперь следующим образом правильно:

Iq.should_receive(:new).with(person).and_call_original 

Это (1) проверить ожидания (2) контроль возврата к исходной функции, а не только вернуть нуль.

+0

Большое спасибо! Это мне очень помогло :) –

+0

Только то, что я искал! – benastan

Смежные вопросы