2011-02-22 14 views
6

Estoy en rspec en estos días, tratando de hacer que mis modelos sean más precisos y precisos. Algunas cosas todavía son un poco raras para mí sobre rspec, así que pensé que sería bueno si alguien pudiera aclararlas.Rspec Rails - El nombre debe ser válido - algunas aclaraciones

Digamos que tengo un modelo de Usuario. Este tiene un: nombre. El nombre debe tener entre 4.15 caracteres (es un objetivo secundario, al principio debe existir). Entonces, ahora estoy pensando: ¿Cuál es la mejor manera de probar eso de una manera que asegure que esto sucederá? Para probar que un usuario debe tener un nombre, he escrito algo como esto:

describe User do 
    let(:user) { User.new(:name => 'lele') } 

    it "is not valid without a name" do 
     user.name.should == 'lele' 
    end 
end 

Ahora, no estoy seguro de que esto logra exactamente lo que quiero. Me parece que en realidad estoy probando Rails con este. Además, si quiero comprobar que un nombre no puede tener más de 15 caracteres y menos de 4, ¿cómo puede integrarse?

EDITAR:

¿Te gusta esto?

describe User do 
    let(:user) { User.new(:name => 'lele') } 

    it "is not valid without a name" do 
     user.name.should_not be_empty 
    end 

end 

Respuesta

5

utilizo esta manera:

describe User do 

    it "should have name" do 
    lambda{User.create! :name => nil}.should raise_error 
    end 

    it "is not valid when the name is longer than 15 characters" do 
    lambda{User.create! :name => "im a very looooooooong name"}.should raise_error 
    end 

    it "is not valid when the name is shorter than 4 characters" do 
    lambda{User.create! :name => "Tom"}.should raise_error 
    end  
end 
+1

¡Tenga en cuenta que todos los .create! los métodos golpean la base de datos y hacen que las pruebas sean ~ 100 veces más lentas. Puede evitar la lentitud y aún verificar la validez usando las instrucciones de @Dylan Markow a continuación. – aaandre

15

probablemente usted está buscando la be_valid matcher:

describe User do 
    let(:user) { User.new(:name => 'lele') } 

    it "is valid with a name" do 
    user.should be_valid 
    end 

    it "is not valid without a name" do 
    user.name = nil 
    user.should_not be_valid 
    end 
end 
2

me gusta poner a prueba los mensajes de error reales para las validaciones:

require 'spec_helper' 

describe User do 
    let (:user) { User.new } 

    it "is invalid without a name" do 
    user.valid? 
    user.errors[:name].should include("can't be blank") 
    end 

    it "is invalid when less than 4 characters" do 
    user.name = "Foo" 
    user.valid? 
    user.errors[:name].should include("is too short (minimum is 4 characters)") 
    end 

    it "is invalid when greater than 15 characters" do 
    user.name = "A very, very, very long name" 
    user.valid? 
    user.errors[:name].should include("is too long (maximum is 15 characters)") 
    end 

end 

También es útil utilizar una fábrica que construye un objeto con atributos válidos, que puede invalidar de uno en uno para la prueba.

+0

enfoque muy interesante, gracias – Spyros

0

me gustaría utilizar algo similar a esto

class User < ActiveRecord::Base 
    validates_presence_of :name 
    validates_length_of :name, :in => 4..15 
end 


describe User do 
    it "validates presence of name" do 
    user = User.new 
    user.valid?.should be_false 
    user.name = "valid name" 
    user.valid?.should be_true 
    end 

    it "validates length of name in 4..15" do 
    user = User.new 
    user.name = "123" 
    user.valid?.should be_false 
    user.name = "123456789" 
    user.valid?.should be_false 
    user.name = "valid name" 
    user.valid?.should be_true 
    end 
end 

Lo más notable es que estoy usando las validaciones de registro activos para ambas condiciones. En mis ejemplos, no confío en las cadenas de error. En ejemplos que prueban el comportamiento de las validaciones, no hay razón para tocar la base de datos, por lo que no es así. En cada ejemplo, pruebo el comportamiento del objeto cuando es válido e inválido.

Cuestiones relacionadas