проблема с factory_girl, devise, rpsec 2.0 и rails 3.0 => не могу получить rspec для проверки контроллера

на github есть ресурсы Как Кому: Тестировать (разрабатывать) с помощью Rails 3 и RSpec. но как это сделать на очень высоком уровне, и я не могу заставить его работать в моем контексте. Каков правильный способ подключить или настроить все эти части вместе, чтобы удалось протестировать контроллер, для которого требуется зарегистрированный пользователь (before_filter:authenticate_user!) ???

Сейчас я пытаюсь запустить rspec на одном контроллере.

require File.dirname(__FILE__) + '/../spec_helper'
describe ArticlesController do
  fixtures :all
  render_views

  before (:each) do
    @user = Factory.create(:user)
    sign_in @user
  end

  it "index action should render index template" do
    get :index
    response.should render_template(:index)
  end
end

вот вывод, когда я запускаю rspec

Failures:
  1) ArticlesController index action should render index template
     Failure/Error: Unable to find matching line from backtrace
     SQLite3::ConstraintException: articles.user_id may not be NULL

person Alpha    schedule 02.11.2010    source источник


Ответы (2)


Похоже, ошибка в ваших приборах. В сообщении об ошибке говорится, что невозможно создать статью без user_id.

Вы можете исправить фикстуры или не использовать их, удалив fixtures :all и заглушив метод find:

before(:each) do
  @user = Factory.create(:user)
  sign_in @user
  Article.stub(:find).and_return([])
end

Это говорит find вернуть пустой массив, который действие индекса вашего контроллера должно назначить переменной экземпляра @articles для использования в шаблоне. Этого должно быть достаточно, чтобы шаблон отображался без ошибок.

person zetetic    schedule 02.11.2010

Я починил приспособление или должен сказать завод таким образом:

Factory.define :article do |e|
  e.name "Article001"
  e.user { |u| u.association(:user) }
end

которые дают мне эту новую ошибку ...

Failures:
  1) ArticlesController index action should render index template
     Failure/Error: response.should render_template(:index)
     expecting <"index"> but rendering with <"devise/mailer/confirmation_instructions">.
     Expected block to return true value.

Я просто хочу, чтобы мой тест прошел метод index моего контроллера статьи. В этом смысле меня не интересует создание пользователя. И ошибка говорит мне, что пользователь был создан.

Я попробовал ваше предложение, но остановился на "заглушке"

Failure/Error: Asset.stub(:find).and_return([])
     undefined method `stub' for #<Class:0x000000048310b8>

Каков наилучший подход между fixture:all и вашим методом?

person Alpha    schedule 02.11.2010