如何使用MiniTest模拟'Socket'的方法?

时间:2014-12-02 15:17:03

标签: ruby unit-testing minitest

我有一个不带参数的short方法,并以字符串形式返回本地IP地址的哈希值作为键,其值为true:

def self.local_ips
  # puts 'Getting ip addresses for this computer...'
  local_ips = {}
  Socket.ip_address_list.each do |address|
    ip_string = address.ip_address
    ip_string.sub!(/\%.*$/, '') # Removes interface from end of some IP's
    local_ips[IPAddr.new(ip_string).to_s] = true
  end
  return local_ips
end

这是正常的,正确定义它正在按预期工作,但我想有一个测试此方法的规范。问题是,Socket.ip_address_list将在每台机器上以不同的方式返回。我想知道在使用MiniTest模拟Socket.ip_address_list的响应时是否有办法,以便可以在任何机器上测试该方法,而不必担心由于与本地机器相关的差异而导致失败。

非常感谢任何帮助。

谢谢!

1 个答案:

答案 0 :(得分:1)

它不是模拟需要使用的,而是一个存根:

fake_ip = Struct.new :ip_address
fake_ips = %w[ woot ]

Socket.stub :ip_address_list, lambda { fake_ips.map { |s| fake_ip.new s } } do
   Socket.ip_address_list.map { |ip| ip.ip_address }
end
# => ["woot"]