2011-12-04 10 views
9

Tengo algunas especificaciones, escritas en RSpec, que prueban varios modelos. Uso Factory Girl para generar objetos para probar.prueba de rspec pasa de forma aislada, pero falla cuando se ejecuta con otras pruebas

Ahora lo más peculiar sucede:
Cuando corro rspec spec/models/specific_model_spec.rb --- esto pasa todas las pruebas en esa especificación

Sin embargo, cuando corro rspec spec/models --- todas las pruebas en esta especificación no se refiere a una asociación inválida que se crea (a través de una fábrica)

La asociación creada por la fábrica es obviamente válida, ya que también se muestra la ejecución de la prueba aisladamente.

¿Qué podría estar causando este comportamiento?

Actualización:
El error que consigo cuando se ejecuta la especificación junto con otras especificaciones (el error es el mismo para cada fallo):

6) StreamItem adds a stream_item to a project and consultant when an engagement is added 
Failure/Error: @project = Factory.create(:project, :name => 'bar') 
Validation failed: Customer is invalid 
# ./spec/models/stream_item_spec.rb:44:in `block (2 levels) in <top (required)>' 

El project factory se prueba en otro spec y pasa fina ...

actualización 2: El código de fábrica pertinente utilizada es la siguiente:

Factory.define :manager, :class => User do |f| 
    f.sequence(:email) { |n| "bar#{n}@example.com" } 
    f.password "pass12" 
    f.sequence(:name) { |n| "Erwin#{n}" } 
    f.roles_mask 4 
end 

Factory.define :customer do |f| 
    f.sequence(:name) { |n| "foo customer#{n}" } 
    f.association :last_actor, :factory => :manager 
    f.account_id 1 
end 

Factory.define :project do |f| 
    f.sequence(:name) { |n| "foo project#{n}" } 
    f.association :manager, :factory => :manager 
    f.association :customer, :factory => :customer 
    f.start_date Date.today << 1 
    f.finish_date Date.today >> 2 
    f.status 1 
    f.association :last_actor, :factory => :manager 
    f.account_id 1 
end 
+0

Veamos los errores. –

+0

Agregó el error. – ErwinM

+0

Gracias. ¿Y tu código de fábrica? –

Respuesta

11

Esto generalmente indica que sus otras especificaciones dejan algunos datos en la base de datos que entran en conflicto con las llamadas de fábrica posteriores. Sospecho que si observas por qué falló el método de creación de fábrica, verás una validación de falla de unicidad, tal vez en el correo electrónico del cliente.

Desactivación de accesorios transaccionales:

# spec_helper.rb 
config.use_transactional_fixtures = false 

database cleaner y utilizar en su lugar. This blog post podría ayudar también.

+0

El problema terminó siendo algunos datos sobrantes. No en la base de datos, sino en una variable global de un complemento. – ErwinM

+3

¿cómo encontraste esta variable global? –

+0

@Thilo La publicación de blog a la que enlazas se ha ido para siempre. – jottr

5

RSpec ahora tiene un "bisect" feature diseñado específicamente para encontrar este tipo de problema.

Ejecute el comando RSpec que está causando el error con el indicador --bisect, y RSpec identificará automáticamente qué combinación de especificaciones está causando ese error.

rspec spec/models --bisect 
+0

Eres un salvavidas hombre :) – Uzair

Cuestiones relacionadas