1

我一直在学习 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 方法,而不是模拟?这样就够了吗?

提前致谢。

4

1 回答 1

0

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

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

于 2013-09-30T12:26:30.310 回答