加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby – 我如何在黄瓜中最好地表达这种与时间相关的情景?

发布时间:2020-12-16 21:02:06 所属栏目:百科 来源:网络整理
导读:我一直在努力学习 Ruby中的Cucumber,我认为最好的方法就是创建自己的项目.但是,我想知道什么是一个好的“给定”条款. 据我所知,“给定”基本上是一个设置,“当”是被测试的功能,“然后”是预期的结果. 例如,让我们假设我正在基于踩着熔岩的实体制作一个Minec
我一直在努力学习 Ruby中的Cucumber,我认为最好的方法就是创建自己的项目.但是,我想知道什么是一个好的“给定”条款.

据我所知,“给定”基本上是一个设置,“当”是被测试的功能,“然后”是预期的结果.

例如,让我们假设我正在基于踩着熔岩的实体制作一个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

然而,这个“给定”步骤看起来相当’关闭’.我不得不站在一块熔岩旁边让这个场景发挥作用.同样 – 我将如何编写(并测试)一个应该经常发生的场景的GWT – 例如,我怎样才能确保只要我的实体保持在熔岩中,它将继续受到损害?我发现很难编写能够测试实体在熔岩中存放多久的代码.系统如何知道实体在熔岩中停留了多长时间?在我看来,测试那种东西需要我几乎写下世界其他地方,以便能够说“这个实体已经在熔岩中持续x秒,推进模拟,我失去了多少马力”

思考?

解决方法

你不必改写世界.你必须能够欺骗你对世界状况的测试(在这种情况下,时间).控制测试时间的通常方法是存根.

我会写这样的场景

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

当我注意到时间是一种人为的时候,如果它有意义的话,你可以把它折叠到另一个步骤. (在这种情况下,我没有看到适当的步骤,但是你可能会在更长的情况下.)当我等待5秒时,完全适合于域.

其他细节:

>它使用第一人称简洁且适合该域名.>给出的是条件在场景开始之前是真实的.考虑它的一种方法是,在Given变为true和实际场景开始之间可能已经过了一段时间,在此期间可能发生了与场景无关的其他事情.>健康与站在熔岩旁边没什么关系,所以这些更好地设置在不同的步骤中.>测试你已经受到两次伤害(而不是你的生命值是8)需要在断言步骤和初始化你的健康状况的Given之间存在依赖关系.最大限度地减少这种依赖性使得Cucumber的步骤更加可重用.因此,只要它不会损害可理解性(我认为在这种情况下它不会这样做),只需在最后确定最终状态.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读