я следующие спецификации для тестирования метода контроллера:Rspec заглушки не работает
context "#create" do
it "should redirect when model is valid" do
User.stub!(:valid?).and_return(true)
post :create, :user => FactoryGirl.attributes_for(:user)
response.should redirect_to("/")
end
it "should render new template when model is invalid" do
User.stub!(:valid?).and_return(false)
post :create, :user => FactoryGirl.attributes_for(:user)
response.should render_template(:new)
end
end
и сам контроллер:
def create
@user = User.new(params[:user])
if @user.save
redirect_to "/", :notice => "User created"
else
render "new"
end
end
Довольно много простой код, но почему-то stub!
метод просто не реально заглушки, поэтому вторая спецификация выходит из строя с expecting <"new"> but rendering with <"">
. Он просто перенаправляется, как если бы valid?
вернулась.
Я совершенно новичок в мире Rails. Что мне не хватает? Благодарю.
OMG Спасибо, например наконечник! Это была проблема. Хотя я думаю, что было бы лучше заглушить низкоуровневые методы, например 'valid?'. Таким образом, я смогу реорганизовать действие, скажем, 'save',' build' & 'create', не нарушая функциональности и тестов. Конечно, в этой ситуации это не так. Прямо сейчас я решил это, присоединив заглушку ко всем экземплярам User 'User.any_instance.stub (: valid?). And_return (true)'. Но ваш намек на экземпляр и класс - это то, что я пропустил в целом. – paulus
Что касается stubbing 'valid?' Вместо 'save', я бы сказал прямо противоположное :) Ваша точка зрения о рефакторинге хорошая, но мы можем повернуть это прямо вокруг - что, если ActiveRecord будет реорганизован, и' save' больше не вызывает 'valid?' под капотом? Теперь ваши тесты прерываются из-за внутренней реализации библиотеки, которую вы не контролируете. – zetetic
Ну, мы вряд ли сможем переключить ActiveRecord в Production, прежде чем тестировать его в Dev/Test, не так ли? :) И если мы будем в Development/Test, то это будет очевидно, так как тесты не сработают с этого момента. Поэтому мы всегда можем относиться к журналу изменений или чему-то, чтобы понять причину. С моей точки зрения, вероятно, что классы приложений будут реорганизованы, чем основные классы. – paulus