2012-02-20 23 views
58

我试图测试方法如下:红宝石Rspec的:测试实例变量无需添加访问源

def unprocess_move(board, move) 
    if move[0].instance_of?(Array) 
    multi_move = @multi_move.pop(2).reverse 
    multi_move.each do |single_move| 
     unapply_move(board, single_move) 
    end 
    else 
    board = unapply_move(board, move) 
    end 
    board 
end 

在这里我要为@multi_move的状态,但我不想添加一个访问器只是为了测试。没有访问器,有没有办法这样做?谢谢。

回答

104

您可以使用Object#instance_variable_get方法来得到这样的对象的任何实例变量的值:

class Foo 
    def initialize 
    @foo = 5 # no accessor for that variable 
    end 
end 

foo = Foo.new 
puts foo.instance_variable_get(:@foo) 
#=> 5 

而且Object#instance_variable_set可用于设置实例变量的值:

foo.instance_variable_set(:@foo, 12) 
puts foo.instance_variable_get(:@foo) 
#=> 12 
+0

但我需要在我的测试中预先设置它。在我测试它之前,它没有任何价值。 – 2012-02-20 16:56:36

+1

@steve_gallagher,看看文档。 'instance_variable_get'旁边有'instance_variable_set'(添加了示例并链接到了文档到答案)。 – 2012-02-20 17:30:06

+0

有趣。我不知道你可以直接进入并设置并获取任何实例变量。不过,我已经看到很多RSpec测试,并且我从来没有见过这些方法。看起来像处理我认为是非常典型的情况的非标准方式。但我并没有抱怨,谢谢你的回答。 – 2012-02-20 17:47:09