Как получается, что Factory Girl не упорядочивает уникальные атрибуты? - PullRequest
11 голосов
/ 23 мая 2011

Моя спецификация контроллера не работает, потому что Factory Girl, похоже, создает неуникальных пользователей, хотя я упорядочиваю атрибуты пользователя, которые должны быть уникальными.

Ошибки

  1) TopicsController POST #create when topic is invalid should render new
     Failure/Error: let(:invalid_topic) {Factory.build :invalid_topic}
     ActiveRecord::RecordInvalid:Validation failed: Email has already been taken, Username has already been taken

  2) TopicsController POST #create when topic is valid should redirect to show
     Failure/Error: let(:valid_topic) {Factory.build :topic}
     ActiveRecord::RecordInvalid:
       Validation failed: Email has already been taken, Username has already been taken

Спецификация контроллера (RSpec)

  describe "POST #create" do                          
    let(:valid_topic) {Factory.build :topic}
    let(:invalid_topic) {Factory.build :invalid_topic}

    context "when topic is invalid" do
      it "should render new" do
        post :create, :topic => invalid_topic
        response.should render_template(:new)
      end
    end
    context "when topic is valid" do
      it "should redirect to show" do
        post :create, :topic => valid_topic
        response.should redirect_to(topic_path(assigns(:topic)))
      end
    end
  end

Заводы

Factory.define :user do |f|
  f.sequence(:username) { |n| "foo#{n}"}
  f.password "password"
  f.password_confirmation { |u| u.password}
  f.sequence(:email) { |n| "foo#{n}@example.com"}
end

Factory.define :topic do |f|
  f.name "test topic"
  f.association :creator, :factory => :user
  f.forum_id 1
end

Почему Factory Girl не упорядочивает атрибуты пользователя, когда я использую Factory.create :topic?

Ответы [ 3 ]

29 голосов
/ 23 мая 2011

rake db:test:prepare казалось, чтобы решить проблему.

Не знаю почему, хотя.Схема не была изменена.

4 голосов
/ 24 сентября 2012

Пожалуйста, рассмотрите возможность использования database_cleaner gem.Одна была разработана специально для выполнения цели очистки базы данных между тестовыми прогонами.

Этот пост объясняет почти все.

3 голосов
/ 17 сентября 2012

Вы должны рассмотреть возможность удаления всех тем вручную в конце теста.Конечно, это не решение номер один, но оно отлично сработало для меня.

after(:all) { Topic.delete_all }
...