¿Cómo es que Factory Girl no está secuenciando atributos únicos?

La especificación de mi controlador falla porque Factory Girl parece estar creando Usuarios no únicos, aunque yo secuencia los atributos de Usuario que deben ser únicos.

Los errores

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 

La especificación del controlador (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 

Las fábricas

 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 

¿Por qué Factory Girl no está secuenciando los atributos de Usuario cuando uso Factory.create :topic ?

rake db:test:prepare pareció solucionar el problema.

Aunque no estoy seguro de por qué. El esquema no había sido cambiado.

Por favor, considere usar la gem database_cleaner . Uno fue diseñado específicamente para cumplir con el propósito de limpiar la base de datos entre ejecuciones de prueba.

Esta publicación explica casi todo.

Debería considerar eliminar todos los temas a mano al final de la prueba. Por supuesto, no es la solución número uno, pero funcionó muy bien para mí.

 after(:all) { Topic.delete_all }