RSpec: ожидание, что модель не работает во время тестирования контроллера - PullRequest
0 голосов
/ 29 апреля 2010

Я пытаюсь написать функциональный тест. Мой тест выглядит следующим образом:

describe PostsController do
  it "should create a Post" do
    Post.should_receive(:new).once
    post :create, { :post => { :caption => "ThePost", :category => "MyCategory" } }
  end
end

Мой PostsController (на самом деле его часть) выглядит следующим образом:

PostController < ActiveRecord::Base

  def create
    @post = Post.new(params[:post])
  end

end

При выполнении теста я всегда получаю сообщение об ошибке, которое говорит, что класс Post ожидал: новый, но так и не получил его. Тем не менее, фактический пост создан.

Я новичок в RSpec. Я что-то упустил?

Ответы [ 2 ]

1 голос
/ 30 апреля 2010

РЕДАКТИРОВАТЬ - выбросить предыдущий мусор

Это должно делать то, что вы хотите

require File.dirname(__FILE__) + '/../spec_helper'

describe PostsController do
  it "should create a Post" do
    attributes = {"Category" => "MyCategory", "caption" => "ThePost"}
    Post.stub!(:new).and_return(@post = mock_model(Post, :save => false))
    Post.should_receive(:new).with( attributes ).and_return @post
    post :create, { :post => attributes }
  end
end

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

0 голосов
/ 29 апреля 2010

Вы можете использовать метод controller Rspec-rails для проверки ожидаемых сообщений на контроллерах, как описано здесь . Итак, один из способов проверить ваше create действие таково:

describe PostsController do
  it "should create a Post" do
    controller.should_receive(:create).once
    post :create, { :post => { :caption => "ThePost", :category => "MyCategory" } }
  end
end

РЕДАКТИРОВАТЬ (аргументируя)

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

Задача действия создания состоит в том, чтобы создать что-то, поэтому проверьте это:

Post.count.should == 1

и тогда вы узнаете, было ли создано сообщение, независимо от как оно было создано.

РЕДАКТИРОВАТЬ # 2 (ум ...)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...