我正在尝试使用 RSpec。由于我不喜欢模拟,我想使用StringIO对象模拟控制台打印。
所以,我想测试Logger该类是否写入Welcome控制台。为此,我的想法是从规范文件中覆盖puts内部使用的方法Logger,以便在Logger其他地方使用时实际上没有任何变化。
这是一些代码:
describe Logger do
Logger.class_eval do
def puts(*args)
???.puts(*args)
end
end
it 'says "Welcome"' do
end
这样做,我需要在类和测试类StringIO之间共享一些对象(它会去问号现在所在的位置) 。Logger
我发现当我在 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"]