Тестирование контроллера с RSpec, Devise, Factory Girl - PullRequest
5 голосов
/ 12 февраля 2012

У меня есть модели: Post и User (Devise). Я тестирую контроллер Post.

describe "If user sign_in" do

   before(:all){ 
     @user = Factory(:user)
   }

   it "should get new" do
     sign_in @user  
     get 'new'
     response.should be_success
     response.should render_template('posts/new')
   end

   it "should create post" do
     sign_in @user
     post 'create', :post => Factory(:post)
     response.should redirect_to(post_path(:post))
   end
 end  

Но второй тест не пройден:

Ошибка / Ошибка: пост 'создать',: пост => Фабрика (: пост) ActiveRecord :: RecordInvalid: Проверка не удалась: электронная почта уже занята, электронная почта уже занята, имя пользователя уже занято

Как мне это исправить?

Ответы [ 2 ]

9 голосов
/ 16 февраля 2012

Вам не нужен еще один драгоценный камень для этого.FactoryGirl имеет встроенные динамические помощники для этого.Я предлагаю посмотреть короткую Railscast об этом.Вот фрагмент того, как это работает:

FactoryGirl.define do
  factory :user do
    sequence(:username) { |n| "foo#{n}" }
    password "foobar"
    email { "#{username}@example.com" }
7 голосов
/ 12 февраля 2012

Вам нужен инструмент для очистки базы данных между тестами.Потому что вы должны иметь возможность запускать каждый тест с чистой базой данных.Я использую database_cleaner , это довольно известный гем, и он работает очень хорошоЭто тоже легко настроить.Пример из README (связанный с RSpec):

RSpec.configure do |config|

  config.before(:suite) do
    DatabaseCleaner.strategy = :transaction
    DatabaseCleaner.clean_with(:truncation)
  end

  config.before(:each) do
    DatabaseCleaner.start
  end

  config.after(:each) do
    DatabaseCleaner.clean
  end

end
...