用Ruby模拟构造函数

aur*_*amo 3 ruby mocha.js

我是一个Java开发人员,玩弄Ruby并喜欢它.我已经明白,由于Ruby的元编程功能,我的单元测试变得更加清晰,我不需要讨厌的模拟框架.我有一个类需要File该类的服务,在我的测试中我不想触及我的真实文件系统.在Java中,我会使用一些虚拟文件系统来更容易地"接缝"传递虚假对象,但在Ruby中显然有点过分.与Java世界相比,我的出现似乎已经非常好了.在我的测试类中,我有一个可选的构造函数参数:

def initialize(file_class=File)
Run Code Online (Sandbox Code Playgroud)

当我需要在课堂上打开文件时,我可以这样做:

@file_class.open(filename)
Run Code Online (Sandbox Code Playgroud)

并且调用转到真正的File类,或者在我的单元测试的情况下,它转到一个不接触文件系统的假类.我知道元编程必须有更好的方法吗?

Bri*_*ips 11

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)

  • 我认为没有必要对模拟库感到厌恶.Mocha正在为您做元线程编程(即重写方法等),您要求手动执行. (3认同)