2011-09-28 43 views
1

我剛剛開始使用BDD和this instructions關於Behat,但我錯過了一個更復雜一點的示例,產品類別示例太簡單(但首先需要 當然..)當你想超越..從BDD開始(使用Behat和Symfony2作爲背景)

我與模特的工作不具有一個唯一的字段,以 做到這一點:

$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('AcmeD emoBundle:Product') - > findOneByName($ productName);),我不知道該怎麼辦..,如何檢索我用來添加默認配置的房間對象?或如何檢索默認配置對象?

那麼,任何想法我應該如何行動?

編輯:

我想補充我感興趣的場景everzet的響應後執行:

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

也許這個場景聽起來很奇怪,但正如我上面說的,我在房間和默認配置中都沒有唯一的字段。

那麼,我的.feature文件中的函數應該是什麼?

回答

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); 
// … 
+0

嗨everzet,我在我的問題中寫了我的場景。 – ziiweb

+0

希望我已經回答了您的問題;-) – everzet