ruby – 我如何在黄瓜中最好地表达这种与时间相关的情景?
我一直在努力学习
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的步骤更加可重用.因此,只要它不会损害可理解性(我认为在这种情况下它不会这样做),只需在最后确定最终状态. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |