2012-03-12 11 views
6

tengo una clase de usuario con un correo electrónico que es único, pero como alcance el inquilino:singularidad de pruebas en un ámbito en un proyecto Rails usando la debería (pero no rspec)

class User < ActiveRecord::Base 
    validates :email, :uniqueness => {:scope => :tenant_id, :allow_blank => true} 
    #... 
end 

Estoy tratando de probarlo con:

class UserTest < ActiveSupport::TestCase 
    context "a user" do 
    setup { @user = create :user } 
    subject { @user } 

    should validate_uniqueness_of(:email).scoped_to(:tenant_id) 
    end 
end 

pero la prueba falla con este mensaje:

errores espera que incluya "ya ha sido tomada" cuando el correo electrónico se establece en "[email protected] xample.com ", obtuve errores: [" el correo electrónico ya se ha tomado (\ "[email protected] \") "," first_name no puede estar en blanco (nil) "," last_name no puede estar en blanco (nil) "] (con diferente valor de tenant_id)

que genera muchas preguntas. ¿Por qué el mensaje de error no coincide? Parece que la dirección de correo electrónico real está incluida en el mensaje de error, pero ¿por qué está incluido? Cuando genero el error de la interfaz de usuario no parece que debe incluirse:

enter image description here

Además, al final se dice que está tratando con un inquilino diferente, que si era cierto, que shouldn No genero ningún error (no ocurre cuando ejecuto la aplicación en sí), pero, ¿por qué espera el error? Solo debería esperar el error si es el mismo tenant_id.

Esto es muy confuso. ¿Alguna idea de lo que está pasando y/o cómo probarla adecuadamente?

Respuesta

15

Acabo de encontrarme con este mismo problema. Hemos sido capaces de resolverlo cambiando

should validate_uniqueness_of(:email).scoped_to(:tenant_id) 

a

should validate_uniqueness_of(:email_id).scoped_to(:tenant_id) 

No sé si es exactamente la misma situación, pero al parecer nuestro problema se debía a los recursos anidados que lanzan la matcher para un bucle de alguna manera .

0

Me parece que el scoped_to tiene problemas oscuros con ciertas pruebas. Cuando se encuentre, será necesario escribir pruebas más detalladas y probar manualmente la falla al crear un objeto en el mismo ámbito.

Cuestiones relacionadas