使用标准的Ruby Test::Unit
框架,在Ruby中对受保护的和私有的方法进行单元测试的最佳方式是什么?
我相信有人会大声疾呼,教条式地断言“你应该只对公共方法进行单元测试;如果它需要单元测试,它就不应该是一个受保护的或私有的方法”,但我对此并不感兴趣。我有几个是保护的或私有的方法,这些私有/受保护的方法是中等复杂的,类中的公共方法依赖于这些受保护/私有方法的正常工作,因此我需要一种方法来测试受保护/私有方法。
还有一件事。我通常将给定类的所有方法放在一个文件中,而将该类的单元测试放在另一个文件中。理想情况下,我希望所有的魔法都能在单元测试文件中实现这个“受保护的和私有方法的单元测试”功能,而不是主源文件,以使主源文件尽可能简单明了。
发布于 2008-11-06 01:31:58
您可以使用send方法绕过封装:
myobject.send(:method_name, args)
这是Ruby的一个“特性”。:)
在Ruby1.9开发期间有内部争论,认为让send
尊重隐私,而send!
忽略它,但最终在Ruby1.9中没有任何改变。忽略下面讨论send!
和破坏内容的评论。
发布于 2008-11-06 17:01:32
如果您使用RSpec,这里有一个简单的方法:
before(:each) do
MyClass.send(:public, *MyClass.protected_instance_methods)
end
发布于 2008-11-06 18:29:53
只需在测试文件中重新打开类,并将一个或多个方法重新定义为public。您不必重新定义方法本身的内部,只需将符号传递给public
调用即可。
如果您的原始类是这样定义的:
class MyClass
private
def foo
true
end
end
在您的测试文件中,只需执行以下操作:
class MyClass
public :foo
end
如果你想公开更多的私有方法,你可以将多个符号传递给public
。
public :foo, :bar
https://stackoverflow.com/questions/267237
复制相似问题