【问题标题】:Ruby Mocking IO - issue with selectRuby Mocking IO - 选择问题
【发布时间】:2012-10-08 17:23:42
【问题描述】:

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

提前致谢。

【问题讨论】:

    标签: ruby testing rspec io mocking


    【解决方案1】:

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

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

    【讨论】:

    • 否,但您可以使用IO.pipe 为测试创建频道
    • 嗯...与模拟相比有点重量级,但是是的。
    • @UncleMikey 我认为你没有明白我的意思。我建议不要在这里使用模拟。测试替身更适合那些类型的 io 操作。根据我的经验,在如此低的级别上进行模拟会导致测试实际上无法防止任何事情,从而在代码被破坏时给人一种错误的信心。
    • 其实我说错了。我同意你的看法。我只是不想自己写那双 :-) 例如,我很惊讶地发现 rspec 中还没有有用的东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-23
    • 1970-01-01
    • 2011-11-09
    • 1970-01-01
    • 2018-08-25
    • 1970-01-01
    相关资源
    最近更新 更多