什么是RSpec测试(Ruby on Rails)上下文中的`StringIO`?

时间:2016-05-30 12:47:22

标签: ruby-on-rails rspec stringio

Ruby on Rails中的StringIO是什么?

我正在尝试理解引用StringIO的另一个SO答案,但它超出了我的想法。

  

我建议使用StringIO来确保你的SUT   接受要写入的流而不是文件名。

testIO = StringIO.new
sutObject.writeStuffTo testIO 
testIO.string.should == "Hello, world!"

来源:Rspec: how to test file operations and file content

Ruby-doc.org

  

String对象上的伪I / O.

资料来源:http://ruby-doc.org/stdlib-1.9.3/libdoc/stringio/rdoc/StringIO.html

Robots.thoughtbot

  

这在我们可能注入StringIO而不是注入的测试中很常见   从磁盘读取实际文件。

来源:https://robots.thoughtbot.com/io-in-ruby#stringio

我的情况:

File.open("data.dat", "wb") {|f| f.write(snapshot)}

在我的应用程序中,我想测试上面的内容,但我仍然对StringIO如何应用于实现RSpec测试感到困惑。

任何有StringIO经验的人都能提供一些指导吗?

1 个答案:

答案 0 :(得分:2)

StringIO是IO对象的基于字符串的替换。它与文件的作用相同,但它作为字符串保存在内存中。

在你的情况下,我认为它并不适用。至少不是你当前的代码。这是因为你有File.open调用创建一个IO对象并立即对它做了一些事情。

例如,如果你有这样的事情:

def write_data(f)
  f.write(snapshot)
end

# your code would be
f = File.open("data.dat", "wb")
write_data(f)

# test would be
testIO = StringIO.new
write_data(testIO)
testIO.string.should == "Hello, world!"