2011-09-23 12 views
9

Tengo un comportamiento de validación extraño: está duplicando los mensajes de error de validación y no puedo entender qué lo causa ... no hace esto en la consola de rails .Rails 3: Duplicar los mensajes de error de validación durante la prueba

Aquí es la validación del modelo de mi teléfono:

# phone.rb 
validates :number, :length => { :minimum => 3 } 

Mi especificaciones:

require 'spec_helper' 

describe Phone do 
    it "requires a number" do 
    user = User.make! 
    @p = Phone.new(number:nil,user_id:user.id,type:2) 
    @p.valid? 
    puts @p.errors.inspect 
    @p.should have(1).error_on(:number) 
    end 

Mis resultados de la prueba:

# rspec and machinist 
#<ActiveModel::Errors:0x000000036f1258 @base=#<Phone id: nil, user_id: 614, kind: nil, number: nil, created_at: nil, updated_at: nil>, @messages={:number=>["is too short (minimum is 3 characters)", "is too short (minimum is 3 characters)"]}> 
F 

Failures: 

    1) Phone requires a number 
    Failure/Error: @p.should have(1).error_on(:number) 
     expected 1 error on :number, got 2 
    # ./spec/models/phone_spec.rb:11:in `block (2 levels) in <top (required)>' 

Finished in 0.50988 seconds 
1 example, 1 failure 

Como se puede ver, estoy recibiendo "es demasiado corto (mínimo 3 caracteres)" dos veces ... También es/solo/ocurre durante la prueba. Alguna idea?

Gracias!

+0

¿Cómo se ven las definiciones de asociación y utiliza validates_associated? –

+0

En el teléfono, 'has_one: user', y en User, it' has_many: phones'. Empecé a usar la gema 'valid_attribute' para probar mis validatons, y eso es mucho mejor que este método. – wulftone

+0

encontraste una solución? – MrEvil

Respuesta

9

El problema está en la línea:

Dir["#{Rails.root}/app/**/*.rb"].each { |f| load f } 

en el archivo spec_helper.rb, en el bloque Spork.each_run

Si cambia el método 'cargar' a 'requerir', se soluciona el problema.

O si tiene una versión reciente de Spork, puede eliminar la línea por completo. estoy seguro de que el error se produce cuando alguien está instalando un Spork versión más reciente (0.9.0+) con las instrucciones antiguas, porque la línea:

Dir["#{Rails.root}/app/**/*.rb"].each { |f| load f } 

ni siquiera tiene que ser declarado explícitamente en el spec_helper archivo .rb más. Si es así, cuando se utiliza el método de carga en el archivo spec_helper.rb, vuelve a cargar los archivos especificados, probablemente la causa de los extraños errores de validación de duplicados de RSpec.

+0

funcionó para mí, gracias –

+0

Mucha gente votó por este, voy a marcarlo como respondí (no he usado spork en mucho tiempo). – wulftone

0

No estoy seguro de si esto va a resolver su problema, pero rspec es muy peculiar si no sigue la convención rspec. Pruebe algunos rspec más idiomática como la siguiente:

requieren 'spec_helper'

describe Phone do 
    context :validations do 
    let(:user) { double(:user) } 
    subject { Phone.new(number:nil,user_id:user.id,type:2) } 

    before do 
     subject.valid? 
    end 

    it 'should have a minimum length of 3' do 
     subject.should have(1).error_on(:number) 
    end 
    end 
end 

También me gustaría sugerir que usted no debe unidad de prueba de Rails construida en validaciones; ya están probados en Rails. Específicamente, su validación de longitud se prueba en activemodel/test/cases/validations/length_validation_test.rb. El comportamiento de las validaciones debe ser cubierto en sus pruebas de integración.

Espero que sea útil.

+0

Genial, gracias por esto. El punto (para mí) para las validaciones de pruebas unitarias es _muy rápidamente_ incluir en la lista blanca/lista negra las cosas que te importan/no te importan (¡las pruebas de integración no son tan rápidas como las pruebas unitarias!) Y la validación válida funciona muy bien para esto ... pero, como referencia, el ejemplo anterior fue tomado directamente del ejemplo del sitio web rspec sobre la validación del modelo: https://www.relishapp.com/rspec/rspec-rails/v/2-8/docs/model-specs/errors- en – wulftone

0

Estoy teniendo el mismo problema (usando rspec & spork).

Sospecho que tiene algo que ver con que el modelo se requiera dos veces, lo que hace que las validaciones se ejecuten dos veces.

Si explicity require 'phone' en la parte superior de su especificación, parece solucionarlo.

Pero realmente me gustaría saber lo que está causando el problema ...

1

me encontré con un problema similar de mensajes de error duplicados, pero parecía tener su origen en mi uso de una estructura de directorios diferente de la norma, por ejemplo:

- app 
    \- models_one 
    |- models_two 
    |- models_three 

Mi llamado load/require en el bloque Spork.each_run parecía de esta manera:

Dir["#{Rails.root}/app/models_*/*.rb"].each { |f| load f } 

quité esto y lo reemplazó con éstos:

ActiveSupport::Dependencies.clear 
ActiveRecord::Base.instantiate_observers 

Y no hubo más mensajes de error duplicados.

Me ayudó esta publicación: http://adams.co.tt/blog/2012/04/12/duplicate-active-model-validation-errors/ en la que el autor dice que es un problema específico de 1.8.7 que implica requerir diferentes rutas que resuelven en el mismo archivo, pero estoy usando 1.9.3 por lo que puede no estar relacionado .

Cuestiones relacionadas