【问题标题】:Ruby Mock a file with StringIORuby 使用 StringIO 模拟文件
【发布时间】:2013-10-07 06:02:09
【问题描述】:

我正在尝试借助 Ruby 中的 StringIO 来模拟 文件读取。 以下是我的测试,旁边是我在主类中的方法。

def test_get_symbols_from_StringIO_file
    s = StringIO.new("YHOO,141414")
    assert_equal(["YHOO,141414"], s.readlines)
end

def get_symbols_from_file (file_name)
  IO.readlines(file_name, ',')
end

我想知道这是否是我们模拟读取文件的方式,也想知道是否有其他方法可以模拟类中的方法,而不是对内容进行断言。

【问题讨论】:

  • @SergioTulentsev 它通过了,但 get_symbols_from_file 实际上从未在测试中调用。
  • @Stefan,我同意。上面的测试没有任何价值,因为该方法甚至从未被调用过!

标签: ruby file-io mocking stringio


【解决方案1】:

您的方法get_symbols_from_file 永远不会在测试中调用。您只是在测试 StringIO#readlines 是否有效,即:

StringIO.new("YHOO,141414").readlines == ["YHOO,141414"] #=> true

如果您想使用 StringIO 实例作为文件的占位符,您必须更改方法以采用 File 实例而不是文件名:

def get_symbols_from_file(file)
  file.readlines(',')
end

FileStringIO 实例都响应readlines,因此上述实现可以同时处理这两种情况:

def test_get_symbols_from_file
  s = StringIO.new("YHOO,141414")
  assert_equal(["YHOO,141414"], get_symbols_from_file(s))
end

但此测试失败:readlines 包含行分隔符,因此它返回一个包含两个元素 "YHOO,"(注意逗号)和 "141414" 的数组。您期待一个包含一个元素 "YHOO,141414" 的数组。

也许你正在寻找这样的东西:

def test_get_symbols_from_file
  s = StringIO.new("YHOO,141414")
  assert_equal(["YHOO", "141414"], get_symbols_from_file(s))
end

def get_symbols_from_file(file)
  file.read.split(',')
end

如果你真的想使用IO::readlines,你可以创建一个Tempfile

require 'tempfile'

def test_get_symbols_from_file
  Tempfile.open("foo") { |f|
    f.write "YHOO,141414"
    f.close
    assert_equal(["YHOO", "141414"], get_symbols_from_file(f.path))
  }
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-24
    • 2013-06-01
    • 2012-09-05
    相关资源
    最近更新 更多