Ruby Mocking IO - 选择问题

时间:2012-10-18 09:33:30

标签: ruby testing rspec io mocking

我一直在学习Ruby,并遇到了一个问题。我正在建立一个战舰游戏来学习语言。

游戏将2个输入和2个输出流引入构造函数(允许两个客户端从同一个终端播放,来自网络连接,或者每个客户端一个)

这适用于游戏本身,但是我也在练习以测试驱动的开发方式工作。这导致了一个问题 - 对于测试(rspec)我模拟输入和输出的IO对象

@outputIO = mock("io")
@inputIO = mock("io")

这适用于大部分工作,但某些部分需要使用select命令,以便两个玩家可以同时输入信息:

result = select([@p1_input,@p2_input], nil, nil)
for r in result[0]
  if r == @p1_input || r == @p2_input
    input = r
  end
end

@ p1_input和@ p2_input在构造函数中设置。运行rspec测试时,我得到:

TypeError: can't convert RSpec::Mocks::Mock into IO

如何模拟IO以使其正常运行?我应该创建一个新的IO实例并覆盖gets方法,而不是模拟?那就够了吗?

提前致谢。

1 个答案:

答案 0 :(得分:0)

在进行IO测试时,我喜欢使用StringIO:http://www.ruby-doc.org/stdlib-1.9.3/libdoc/stringio/rdoc/StringIO.html

当你依赖像select这样的低级方法时,我认为模拟或删除这些部分并不是一个好主意。你不会得到任何形式的东西。尝试在你的测试中做真实的东西,但重构其中的所有逻辑,这样你就可以进行正常的测试。