ruby - sesiones - ¿Cómo establecer la variable de instancia privada utilizada en una prueba de método?
sesiones en rails (2)
Dada una clase con un par de variables de instancia y algunos métodos. Algunas variables de instancia se establecen a través de attr_reader
y attr_accessor
. Por lo tanto, los otros son privados.
Algunas de las variables de instancia privada se configuran en uno de los métodos de instancia y se leen / utilizan dentro de otro método.
Para las pruebas estoy usando RSpec. Como todavía soy nuevo para Ruby y quiero hacer las cosas bien, definí que mis pruebas son bastante precisas. Por lo tanto, tengo un bloque de describe
para cada método de instancia, que a su vez están divididos en un subconjunto de context
sy it
s. Las condiciones previas ambientales generales se definen con before
.
Sin embargo, al probar uno de los métodos, que utiliza pero no establece una de las variables privadas, necesito llamar al otro método, que está configurando esta variable. Esto parece bastante pesado y no modular para mí.
¿Hay alguna manera de forzar una variable de instancia privada a un cierto valor? Similar a " extraer " el valor de una variable de instancia privada con Object::instance_eval(:var)
.
Como respondiste en tu pregunta, la forma más sencilla de establecer la variable de instancia es con el método instance_eval
:
obj.instance_eval(''@a = 1'')
Otra forma es usar instance_variable_set:
obj.instance_variable_set(:@a, 1)
Pero no recomendaría hacer esto en sus especificaciones. Las especificaciones tratan sobre el comportamiento de prueba de un objeto y el comportamiento de prueba al romper la encapsulación de clase con instance_eval
hará que sus pruebas sean más frágiles y dependan de la implementación.
El enfoque alternativo para el aislamiento del estado del objeto es para los métodos de accesor stub:
class UnderTest
attr_accessor :a
def test_this
do_something if a == 1
end
end
#in your test
under_test = UnderTest.new
under_test.stub(:a).and_return(1)
Use instance_variable_set
:
class SomeClass
attr_reader :hello
def initialize
@hello = 5
end
# ...
end
a = SomeClass.new
a.hello # => 5
a.instance_variable_set("@hello", 7)
a.hello # => 7