在Ruby中模拟构造函数

时间:2020-03-05 18:55:56  来源:igfitidea点击:

我是一名Java开发人员,喜欢Ruby,并且很喜欢它。我了解到,由于Ruby的元编程功能,我的单元测试变得更加简洁,并且我不需要讨厌的模拟框架。我有一个需要"文件"类服务的类,在我的测试中,我不想触碰我的真实文件系统。在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)

回答

在我们概述的情况下,我建议我们正在做的事情看起来不错。我知道这是James Mead(Mocha的作者)提倡的技术。无需仅仅为了它而进行元编程。这就是詹姆斯不得不说的(以及我们可以尝试的其他多种技巧)