作者热门文章
- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我一直在努力学习 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
变为真与实际场景开始之间可能已经过去了一段时间,在此期间可能发生了与场景无关的其他事情。<Given
之间的依赖关系。最小化此类依赖性可使 Cucumber 步骤更加可重用。因此,只要它不损害可理解性(我认为在这种情况下不会),就在最后断言最终状态。关于ruby - 我如何最好地在 Cucumber 中表达这种依赖于时间的场景?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21464760/
我是一名优秀的程序员,十分优秀!