Ruby Rspec:在不向源添加访问器的情况下测试实例变量
Posted
技术标签:
【中文标题】Ruby Rspec:在不向源添加访问器的情况下测试实例变量【英文标题】:Ruby Rspec : Testing instance variables without adding an accessor to source 【发布时间】:2012-03-10 23:20:09 【问题描述】:我正在尝试测试以下方法:
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 设置状态,但我不想添加仅用于测试的访问器。有没有办法在没有访问器的情况下这样做?谢谢。
【问题讨论】:
【参考方案1】:您可以使用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
【讨论】:
但是我需要在我的测试中预先设置它。在我测试之前它没有价值。 @steve_gallagher,看看文档。instance_variable_set
就在 instance_variable_get
旁边(添加了示例和答案的文档链接)。
有趣。我不知道您可以直接进入并设置并获取任何这样的实例变量。不过,我见过很多 RSpec 测试,但从未见过调用这些方法。似乎是一种非标准的方式来处理我认为非常典型的情况。不过,我没有抱怨,谢谢你的回答。
@steve_gallagher,我认为您之前没有看到的原因是,在大多数情况下,对象的私有状态不是您应该测试的。如果你的目标是测试某个对象的行为和逻辑,你应该测试它的作用,而不是它的作用。如果您不提供对某些实例变量的公共访问(例如在您的情况下不为它定义 getter),则只要对象按其应有的行为方式运行,对象之外的人就无需关心其状态。在您的情况下,最好测试结果而不是设置某些实例变量的事实。
非常感谢您的解释,现在换个角度来看,我不知道为什么我之前没有注意到,显然我需要重构它以便实例变量不需要设置 t 以证明该方法有效。再次感谢。以上是关于Ruby Rspec:在不向源添加访问器的情况下测试实例变量的主要内容,如果未能解决你的问题,请参考以下文章
有没有办法在不向表格元素添加类的情况下将 css 应用于元素? [复制]
我可以在不向 CloudWatch 仪表板添加警报的情况下定义具有扩展策略的 EC2 自动扩展组吗?