1

我一直在谷歌上寻找答案,但我似乎找不到正确的答案。

基本上我想在我的引擎中测试不同的用户界面(控制台)。我被告知要使用模拟课程,但我在任何地方都找不到直接的答案。

编辑:

这是模拟类(UI)的好方法吗

class UiMock

def initialize
  @player_one = true
  @player_two = true
  @board = ["1", "2", "3", "4", "5", "6", "7", "8", "9"]
end

def set_move(mark, index)
  @move_set = true
  @board[(index.to_i) - 1] = mark
end

测试会是这样的

ui = UiMock.new
game = Game.new(ui)

it "creates a game" do
  game.player_one.should be_true
  game.player_two.should be_true
end

it "sets a move" do
  game.set_move("X", 5)
  ui.move_set.should be_true
end
4

2 回答 2

0

我认为您正在寻找Aruba的延伸。

页面也是所有命令行的绝佳资源。

于 2013-05-16T03:54:33.460 回答
0

最简单的模拟对象实际上可能是:

mock_ui = Object.new
game = Game.new( mock_ui )
# Now run your test

通常,您将需要模拟来响应 Game 类使用的方法。如果您提供需要测试的 Game 类的一种方法的示例,以及它调用的真实 UI 类的哪些方法,我可以扩展这个答案以展示它是如何工作的。

目前尚不清楚您是否被要求编写一个已知 ui 类的完整模拟,或者为特定测试编写更简单和更严格的东西。模拟的完全模拟较少使用,因为它们需要花费大量精力来编写,但优点是测试对实现的变化不太敏感。例如,您可以memcached使用哈希编写模拟服务,并且几乎完全将接口复制到Memcached类(您将失去的功能是跨进程缓存,通常不是您要测试的东西 - 至少不是在单元测试中)。

我认为您当前的模拟和测试可以简化一点,因为有些代码似乎没有测试任何东西(还)

class UiMock

  attr_reader :move_set

  def set_move(mark, index)
    @move_set = true
  end
end

测试:

ui = UiMock.new
game = Game.new(ui)

it "sets a move" do
  game.set_move("X", 5)
  ui.move_set.should be_true
end

删除一些代码的原因是不清楚是否需要它。也许您需要在模拟 UI 中表示棋盘和玩家,但到目前为止,您编写的测试断言不需要它。建议您根据测试和代码的需要逐步构建它们(甚至在添加一两个测试和添加匹配功能之间交替 - 每个部分都足以显示接下来需要编码的内容),除非您已经有了你脑海中非常清楚所有代码最终将如何组合在一起。

请注意,mocha上面的测试有一个简单的模式:

require 'mocha'
ui = Object.new
game = Game.new(ui)

it "sets a move" do
  ui.expects( :set_move )
  game.set_move("X", 5)
end
于 2013-05-16T06:10:21.850 回答