51 votes

Comment définir privé de l'instance de la variable est utilisée dans une méthode de test?

Étant donné une classe avec un couple de variables d'instance et des méthodes. Certaines variables d'instance sont fixés accessible via attr_reader et attr_accessor. Ainsi, les autres sont privées.
Certaines des variables d'instance privé, se mettre à l'intérieur de l'une des méthodes d'instance et de lire/utilisé à l'intérieur d'une autre méthode.

Pour le test je suis en utilisant RSpec. Comme je suis encore nouveau pour le Rubis et souhaitez obtenir toutes les choses, j'ai défini mes tests étant plutôt fine. Donc j'ai un describe bloc pour chaque méthode d'instance, qui sont elles-mêmes divisées en un sous-ensemble de l' contexts et its. Général de l'environnement les conditions préalables sont définis avec before.

Cependant, lors de l'essai de l'une des méthodes, ce qui est l'utilisation, mais pas la définition d'une des variables privées, j'ai besoin d'appeler l'autre méthode, qui est la définition de cette variable. Cela semble plutôt en surpoids et pas modulaire pour moi.

Est-il un moyen de forcer une instance privée variable à une certaine valeur. Similaires à "arracher" la valeur d'une instance privée variable Object::instance_eval(:var).

92voto

Alex Kliuchnikau Points 8411

Comme vous avez répondu à votre question de la façon la plus simple pour définir la variable d'instance est avec instance_eval méthode:

obj.instance_eval('@a = 1')

Une autre façon est d'utiliser des instance_variable_set:

obj.instance_variable_set(:@a, 1)

Mais je recommande de ne pas le faire dans votre specs. Spécifications sont tous sur le test de comportement d'un objet et de tests de comportement par la rupture de la classe d'encapsulation avec instance_eval feront de vos tests de plus en plus fragile et dépendant de l'implémentation.

L'approche Alternative à l'état d'objet de l'isolement est à la stub des méthodes accesseurs:

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)

10voto

robbrit Points 7531

Utiliser 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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X