rspec не получает метод сохранения - PullRequest
1 голос
/ 28 августа 2010

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

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

Это в основном прямо из Rails Tutorial Майкла Хартла

Случаи "успеха" возвращают "ожидаемое сохранение, но оно получено 0 раз", и "сбой"case перенаправляет в неправильное место. Кажется, что он игнорирует блок if / else.

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

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

Спасибо, Джо


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

1 Ответ

2 голосов
/ 29 августа 2010

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

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

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

...