使用RSpec Ruby模拟用户界面

时间:2013-05-15 20:49:47

标签: ruby rspec mocking

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

基本上我想在我的引擎中测试不同的用户界面(控制台)。有人告诉我使用Mock Classes,我无法在任何地方找到直接答案。

编辑:

这是一种模拟类(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

2 个答案:

答案 0 :(得分:0)

我认为您正在寻找Aruba的扩展名。

此外,this page是所有命令行的绝佳资源。

答案 1 :(得分: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

删除部分代码的原因是不清楚是否需要它。也许你需要代表你的模拟用户界面中的棋盘和玩家,但到目前为止你所编写的测试断言并不需要它。建议随着时间的推移建立这些测试和代码需要它们(甚至在添加一个或两个测试和添加匹配功能之间交替 - 在每个部分上足以显示接下来需要编码的内容),除非您已经有非常清晰地了解最终所有代码如何组合在一起。

请注意,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