我刚刚开始使用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文件中的函数应该是什么?
答案 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);
// …