gpt4 book ai didi

ruby - 我如何最好地在 Cucumber 中表达这种依赖于时间的场景?

转载 作者:数据小太阳 更新时间:2023-10-29 07:17:46 25 4
gpt4 key购买 nike

我一直在努力学习 Ruby 中的 Cucumber,我认为最好的方法是创建自己的项目。但是,我想知道什么是好的“给定”子句。

据我理解,“Given”基本上是一个设置,“When”是被测函数,“Then”是预期结果。

例如,假设我正在制作一个基于踏入熔岩的实体的 Minecraft 场景。我当前的 G-W-T 看起来像这样:

Scenario: Take damage when I stand in lava.
Given an entity is standing next to a block of lava with 10 health
When the entity steps in the block of lava
Then the entity should take 2 damage

但是,这个“给定”步骤似乎相当“偏离”。我必须站在一 block 熔岩旁边才能使这种情况起作用,这是没有意义的。类似地 - 我将如何为应该始终发生的场景编写(和测试)GWT - 例如,我如何确保只要我的实体留在熔岩中,它就会继续受到损害?我发现很难编写代码来测试一个实体在熔岩中站立了多长时间。系统如何知道实体在熔岩中浸泡了多长时间?在我看来,测试这类事情几乎需要我写下世界其他地方,以便能够说“这个实体已经在熔岩中停留了 x 秒,推进模拟,我损失了多少 hp”

想法?

最佳答案

您不必重写世界。您只需要能够欺骗您对世界状态(在本例中为时间)的测试。控制测试时间的常用方法是 stub 。

我会这样写那个场景

Scenario: Take damage when I stand in lava.
Given I have 10 health
And there is a block of lava next to me
When I note the time
And I step in to the block of lava
And I wait 5 seconds
Then I should have 8 health

并像这样实现时间步长:

When /^I note the time$/ do
@start = Time.now
end

When /^I wait (\d+) seconds$/ do
Time.stub(:now) { @start + 5.seconds }
end

当我记下时间 时有点人为,所以如果有意义的话,您可以将其折叠到另一个步骤中。 (在这种情况下,我没有看到合适的步骤,但您可能会遇到更长的情况。)不过,When I wait 5 seconds 非常适合该域。

其他细节:

  • 使用第一人称,简洁,适合领域。
  • Given 适用于场景开始前为真的条件。一种思考方式是,在 Given 变为真与实际场景开始之间可能已经过去了一段时间,在此期间可能发生了与场景无关的其他事情。<
  • 健康与站在熔岩旁边没有太大关系,因此最好分步设置。
  • 测试你受到了两次伤害(而不是你的健康是 8)需要断言步骤和初始化你的健康的 Given 之间的依赖关系。最小化此类依赖性可使 Cucumber 步骤更加可重用。因此,只要它不损害可理解性(我认为在这种情况下不会),就在最后断言最终状态。

关于ruby - 我如何最好地在 Cucumber 中表达这种依赖于时间的场景?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21464760/

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