我正在尝试使用 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"]