2010-08-28 2 views
1

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

У меня возникла проблема с моим тестовым кодом. Приложение работает, и я вижу, как хвост журналов тестов записывается в базу данных, но по какой-то причине он не возвращает метод сохранения должным образом.

Это в основном прямо из Rails Tutorial

«успех» дела Майкла Hartl в возвращаете «ожидается сохранить, но получили 0 раз», а «случай неудачи перенаправляет на неправильном месте. Похоже, что это игнорирование, если/еще блока.

Вот соответствующий код из спецификации контроллера и контроллера

Я бы очень признателен за любое понимание этого.

Спасибо,-Joe


class WebsitesController < ApplicationController 
    before_filter :require_user, :only => [:new, :edit, :create, :destroy] 

    def new 
    @website = Website.new 
    @title = "Add New Website" 
    end 

    def edit 
    @website = Website.find(params[:id]) 
    @title = "Edit Website" 
    end 

    def create 
    @website = current_user.websites.build(params[:website]) 
    if @website.save 
     flash[:success] = "Website Added!" 
     redirect_to(profile_url) 
    else 
     render 'new' 
     @title = "Add New Website" 
    end 
    end 

    def destroy 

    end 

end 

require 'spec_helper' 

describe WebsitesController do 
    integrate_views 

    describe "POST 'create'" do 

    before(:each) do 
     activate_authlogic 
     @user = Factory(:user) 
     UserSession.create(@user, true) 
     @attr = { 
     :domain => "http://www.example.com", 
     :description => "example site" 
     } 
     @website = Factory(:website, @attr.merge(:user => @user)) 
     @user.websites.stub!(:build).and_return(@website) 
    end 

    describe "failure" do 

     before(:each) do 
     @website.should_receive(:save).and_return(false) 
     end 

     it "should render the 'new' page" do 
     post :create, :website => @attr 
     response.should render_template('websites/new') 
     end 
    end 

    describe "success" do 

     before(:each) do 
     @website.should_receive(:save).and_return(true) 
     end 

     it "should redirect to the profile page" do 
     post :create, :website => @attr 
     response.should redirect_to(profile_url) 
     end 

     it "should have a flash message" do 
     post :create, :website => @attr 
     flash[:success].should =~ /website added/i 
     end 
    end 
    end 
end 

ответ

2

Он смотрит на меня, как вы используете should_receive когда вы должны использовать stub. Я боролся с этим сам, и придумали с этим правилом:

use mocks/stubs when you DON'T want to test something 
use message expectations when you DO want to test something 

В вашем случае, если вы хотите, чтобы проверить, что страница отображается, запрос перенаправляется, и вспышка установлена. Таким образом, вы устанавливаете ожидания сообщений об этих условиях. Вы НЕ хотите проверить, что модель сохранена или не сохранена, поэтому вы используете для этого заглушки.

+0

Спасибо, что, похоже, решает часть проблемы. Хотя я думаю, что происходит нечто более тонкое. Условие отказа перенаправляется на то же место, что и успех (только в тестах). Похоже, что он игнорирует инструкцию if/else в контроллере. – jpoday

+0

Интересно. Правильно ли перенаправляется действие успеха? Возможно ли, что 'before_filter' не позволяет сохранить сохранение? – zetetic

+0

Действие успеха действительно перенаправляется. Это очень странно. Если я полностью удаляю if/else и просто покидаю @ website.save, все тесты проходят (затушевывают или должны получать), но затем он жалуется, что представления отсутствуют. Я думаю, что это before_filter. У меня такое чувство, что я не правильно создаю UserSession в тестах. – jpoday

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