gpt4 book ai didi

ruby - 如何测试具有依赖性的主题?

转载 作者:数据小太阳 更新时间:2023-10-29 08:05:33 26 4
gpt4 key购买 nike

我想用 Ruby 开发一个基于卡片的游戏,我想用TDD的方式来做。

我要写的第一个类是Player。每个玩家都有一个,有 13 张牌,轮到他/她可以选择并打出 1 张牌。

我没有开发任何其他类(如卡片、手、..),我想知道如何测试这个与其他类有依赖关系的主题?

我知道 Mocks,但我不知道如何使用它们。

例如,在这种情况下,我们知道当玩家打出一张牌时,应该将该牌从他/她的手上移除。

这是我的代码:

require "rspec"
require "lib/player"

describe Player do
before(:each) do
hand=mock("Hand")
hand.should_receive(:count).and_return(13)
subject.hand=hand
end

it "should choose and play a card from her/his hand" do
subject.hand.count.should==13
card_selected=subject.play(2) # card #2 in his/her hand
subject.hand.count.should=12
end
end

另外,在实现中我们依赖于Hand类,我该如何处理?

最佳答案

我看到了我的 mocking 和 stubbing,而且我看到大量的测试套件通过了,即使应用程序被破坏得令人难以置信,因为一半的代码甚至不再存在。

我得出的结论是,应该格外小心地使用 stub 和模拟。那个,以及它应该尽可能晚引入的事实。

这是模拟为时过早的情况之一。你在模拟只是因为你还没有 Hand 类。

作为旁注,测试本身需要改进。仔细看看这些行:

hand.should_receive(:count).and_return(13)
subject.hand=hand
subject.hand.count.should==13
subject.hand.count.should=12

当然,subject.hand.count.should==13 通过了,你只是把它 stub 到这个值。当然,subject.hand.count.should=12 会通过,因为您没有调用 ==。如果您将其更改为真正的期望,您会想知道它为什么会失败。它失败了,因为您将 Hand#count stub 为总是返回 13。

您实际上在这里做的是模拟被测 API 的一部分。不要这样做。相反,从小步骤开始。这可能意味着:

  • 您从内部开始,逐步走出困境。因此,从最里面的类开始,在本例中为 Hand。进入 Player 后,所有部分都可以很好地组合在一起,无需模拟。

  • 您从 Player 开始,直到您绝对需要另一个类(如果“有意义的 API”的论点对您有吸引力,请执行此操作)。这意味着:WAITING Hand 上的 NameError。然后根据需要实现尽可能多的 Hand 类。然后回到Player

此外,查看您的代码会提出一个问题:出于好奇,您为什么首先要将玩家和她的手分开?

关于ruby - 如何测试具有依赖性的主题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9217615/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com