我一直在寻找谷歌的答案,但我似乎无法找到正确的答案。
基本上我想在我的引擎中测试不同的用户界面(控制台)。有人告诉我使用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
答案 0 :(得分:0)
答案 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