从BDD开始(使用Behat和Symfony2作为背景)

时间:2011-09-28 16:58:01

标签: symfony cucumber bdd

我刚刚开始使用BDD和this instructions关于Behat,但我错过了一个更复杂的例子,产品类别的例子太简单了(但是 当然首先必要..)当你想要超越..

我正在使用没有唯一字段的模型 这样做:

$product = this->getRepository('AcmeDemoBundle:Product')->findOneByName($productName);

在我的情况下,我有1:1的关系:

Room
  hotel_id
  ...

Default configuration
  room_id
  name    //"single room", "double room"...
  price
  ...

所以,当我想创建场景时“场景:房间有默认值 配置“我想以这种方式开始:

I have a room XXX

但我不能,因为我没有“名字”或任何其他字段 这是独特的,所以我只写:

I have a room

当我想要检索房间以添加默认值时,问题就出现了 配置如示例产品类别($ product = $ this-> getRepository('AcmeDemoBundle:Product') - > findOneByName($ productName);),我不知道该怎么做do ..,如何检索我用来添加默认配置的房间对象?或者如何检索默认配置对象?

那么,任何想法我该怎么做?

修改

在everzet的响应之后,我想添加我对实现感兴趣的场景:

When I add a default configuration to a room
Then I should find a room has a default configuration

也许这种情况听起来很奇怪,但正如我上面所说,我在Room和Default Configuration中都没有唯一的字段。

那么,我的.feature文件中的函数应该是什么?

1 个答案:

答案 0 :(得分:1)

所有场景步骤定义都在单个上下文类实例中运行,每个场景都有自己的上下文实例。这意味着,您可以在一个步骤定义中在当前上下文中设置ivars,并在下一步定义中读取它的值。它甚至在Behat文档中描述; - )

在您的情况下,您的I have a room步骤可以将上一个持久记录ID保存到上下文中,下一步可以使用它的值来查找数据库中特定(最后添加的)房间。像那样:

// Given I have a room
// …
$room = new Room();
$em->persist($room);
$em->flush();
$this->lastRoomId = $room->getId();
// …

// Then this room should have ...
// …
$room = $em->getRepository('AcmeDemoBundle:Room')
    ->findOneById($this->lastRoomId);
// …