2012-03-31 3 views
4

я следующие спецификации для тестирования метода контроллера: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. Что мне не хватает? Благодарю.

ответ

4

При сохранении объекта Rails вызывает valid? экземпляр класса. Но вы обрезали valid? на самом классе. Это не сработает.

Что вы хотите сделать здесь, это заглушка save на примере пользователя пользователя, который сохраняется, например.

User.stub(:new) { mock_model(User, :save => true) }

@user = User.new # @user теперь фиктивный объект

@user.save # фиктивный объект возвращает true

Для другого примера:

User.stub(:new) { mock_model(User, :save => false) }

@user = User.new # снова, @user - макет

@user.save # фиктивный объект возвращает false

+0

OMG Спасибо, например наконечник! Это была проблема. Хотя я думаю, что было бы лучше заглушить низкоуровневые методы, например 'valid?'. Таким образом, я смогу реорганизовать действие, скажем, 'save',' build' & 'create', не нарушая функциональности и тестов. Конечно, в этой ситуации это не так. Прямо сейчас я решил это, присоединив заглушку ко всем экземплярам User 'User.any_instance.stub (: valid?). And_return (true)'. Но ваш намек на экземпляр и класс - это то, что я пропустил в целом. – paulus

+0

Что касается stubbing 'valid?' Вместо 'save', я бы сказал прямо противоположное :) Ваша точка зрения о рефакторинге хорошая, но мы можем повернуть это прямо вокруг - что, если ActiveRecord будет реорганизован, и' save' больше не вызывает 'valid?' под капотом? Теперь ваши тесты прерываются из-за внутренней реализации библиотеки, которую вы не контролируете. – zetetic

+0

Ну, мы вряд ли сможем переключить ActiveRecord в Production, прежде чем тестировать его в Dev/Test, не так ли? :) И если мы будем в Development/Test, то это будет очевидно, так как тесты не сработают с этого момента. Поэтому мы всегда можем относиться к журналу изменений или чему-то, чтобы понять причину. С моей точки зрения, вероятно, что классы приложений будут реорганизованы, чем основные классы. – paulus

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