2010-02-14 11 views
5

Así que soy bastante nuevo en ruby ​​en general, y estoy escribiendo algunos casos de prueba rspec para un objeto que estoy creando. Muchos de los casos de prueba son bastante básicos y solo quiero asegurarme de que los valores se completen y devuelvan correctamente. Me pregunto si hay una manera para que yo haga esto con una construcción en bucle. En lugar de tener que tener un assertEquals para cada uno de los métodos que quiero probar.Cómo ejecutar un método de objeto arbitrario de una cadena en ruby?

Para instace:

describe item, "Testing the Item" do 

    it "will have a null value to start" do 
    item = Item.new 
    # Here I could do the item.name.should be_nil 
    # then I could do item.category.should be_nil 
    end 

end 

Pero quiero alguna manera de utilizar una matriz para determinar todas las propiedades para comprobar. Entonces podría hacer algo como

propertyArray.each do |property| 
    item.#{property}.should be_nil 
end 

¿Funcionará algo así o algo así? Gracias por cualquier ayuda/sugerencia.

Respuesta

6

object.send(:method_name) o object.send("method_name") funcionará.

Así, en su caso

propertyArray.each do |property| 
    item.send(property).should be_nil 
end 

debe hacer lo que quiera.

+0

¡Gracias! Sabía que tenía que haber una manera de hacerlo. – Boushley

1

Si lo hace

propertyArray.each do |property| 
    item.send(property).should be_nil 
end 

dentro de un solo ejemplo de especificaciones y si su especificación falla, entonces será difícil de depurar el cual atributo no es nula o lo que ha fallado. Una mejor manera de hacer esto es crear un ejemplo de especificaciones separado para cada atributo como

describe item, "Testing the Item" do 

    before(:each) do 
    @item = Item.new 
    end 

    propertyArray.each do |property| 

    it "should have a null value for #{property} to start" do 
     @item.send(property).should be_nil 
    end 

    end 

end 

Esto ejecutará su especificación como un ejemplo de especificaciones diferentes para cada propiedad y si falla, entonces sabrá lo que ha fallado. Esto también sigue la regla de una afirmación por ejemplo de prueba/especificación.

1

un par de puntos sobre Object#send() ...

Puede especificar parámetros para la llamada al método también ...

an_object.send(:a_method, 'A param', 'Another param') 

me gusta usar esta otra forma __send__ porque "enviar" es tan común ...

an_object.__send__(:a_method) 
Cuestiones relacionadas