【发布时间】:2013-11-06 14:50:54
【问题描述】:
我正在试验 RSpec。
由于我不喜欢模拟,我想使用StringIO 对象模拟控制台打印。
所以,我想测试Logger 类是否将Welcome 写入控制台。为此,我的想法是从规范文件中覆盖 Logger 中使用的 puts 方法,这样在其他地方使用 Logger 时实际上没有任何变化。
这里有一些代码:
describe Logger do
Logger.class_eval do
def puts(*args)
???.puts(*args)
end
end
it 'says "Welcome"' do
end
这样做,我需要在Logger 类和测试类之间共享一些StringIO 对象(它会去问号所在的位置)。
我发现当我在 RSpec 测试中时,self 是Class 的一个实例。我最初的想法是做这样的事情:
Class.class_eval do
attr_accessor :my_io
@my_io = StringIO.new
end
然后将??? 替换为Class.my_io。
当我这样做时,一千个钟声在我脑海中响起,告诉我这样做不是一个干净的方法。
我能做什么?
PS:我还是不明白:
a = StringIO.new
a.print('a')
a.string # => "a"
a.read # => "" ??? WHY???
a.readlines # => [] ???
还是:StringIO.new('hello').readlines # => ["hello"]
【问题讨论】: