我是一个Java开发人员,玩弄Ruby并喜欢它.我已经明白,由于Ruby的元编程功能,我的单元测试变得更加清晰,我不需要讨厌的模拟框架.我有一个类需要File
该类的服务,在我的测试中我不想触及我的真实文件系统.在Java中,我会使用一些虚拟文件系统来更容易地"接缝"传递虚假对象,但在Ruby中显然有点过分.与Java世界相比,我的出现似乎已经非常好了.在我的测试类中,我有一个可选的构造函数参数:
def initialize(file_class=File)
当我需要在课堂上打开文件时,我可以这样做:
@file_class.open(filename)
并且调用转到真正的File类,或者在我的单元测试的情况下,它转到一个不接触文件系统的假类.我知道元编程必须有更好的方法吗?
Mocha(http://mocha.rubyforge.org/)是一个非常好的ruby模拟库.根据您实际想要测试的内容(例如,如果您想伪造File.new调用以避免文件系统依赖性,或者如果您想验证正确的参数是否传递到File.new),您可以执行此操作这样的事情:
require 'mocha'
mock_file_obj = mock("My Mock File") do
stubs(:some_instance_method).returns("foo")
end
File.stubs(:new).with(is_a(String)).returns(mock_file_obj)