2013-08-28 3 views
1

Зачем вам использовать stub, учитывая, что вы должны тестировать реальные классы в любом случае?Rspec stub зачем использовать вообще

Я знаю, что есть случаи, когда вы не хотите тестировать другие классы и не перебирать другие связанные методы класса, но я все же считаю, что лучше использовать реальные методы.

Я могу только действительно видеть выгоду, когда вы хотите, чтобы быстро пропустить другие связанные с ним задачи один метод и возвращает конечный результат будет использоваться в тестах

Есть и другие преимущества, однако, что мы должны рассматривать?

(В дополнение к вышесказанному, я также думаю, что stub рискованно как хорошо, так как ваш код может меняться по мере его развития и может генерировать различный результат того, что она приносит в тестах)

+1

узким местом при помощи заглушек так просто, как гася неправильные вещи. Они потрясающе помогают избежать попадания в базу данных или не прикасаются к связанным данным, которые не могут быть сгенерированы. Если вы тестируете устройство, заглушки, как правило, являются отличным инструментом. Модульные тесты должны быть простыми, им не нужно проверять все связанные данные или процесс применения этих данных. Устранение правильной вещи - это то, что люди обычно ошибаются. –

+0

В серьезном крупном корпоративном приложении, где любые небольшие изменения чрезвычайно чувствительны, не лучше ли было бы избежать «заглушки» и, скорее, протестировать взаимодействие с базой данных? (с тестовой базой данных и данными теста) –

ответ

1

Это зависит от теста, что вы выполнения. Для модульных тестов, где вы тестируете только один класс, заглушки полезны.

В качестве примера, предположим, что вы тестируете класс, который отправляет по электронной почте, когда какой-либо другой объект завершает did_it! операцию:

describe Emailer do 
    context ".send_email" do 
    it "sends an email if another object 'did_it!'" do 
     obj = Obj.new 
     Emailer.send_email(obj).should == true # the email sends successfully 
    end 
    end 
end 

В этом случае, если obj.did_it! супер дорогая операция, или это может не с перерывами, этот тест может иметь проблемы.

Однако, в этом тесте мы только все равно, что Emailer.send_email работает правильно, когда obj.did_it! возвращается true --мы не волнует, что метод obj.did_it! работает, потому что это не то, что мы тестируем.

Таким образом, мы используем корешки сказать, «при условии, что obj.did_it! успешно, делает Emailer.send_email на самом деле отправить электронную почту?»:

describe Emailer do 
    context ".send_email" do 
    it "sends an email if another object 'did_it!'" do 
     obj = stub(:did_it! => true) 
     Emailer.send_email(obj).should == true # the email sends successfully 
    end 
    end 
end