2009-09-10 62 views
1

每當這一步會話[]不會在黃瓜持續步驟

Given /blah.../ 
    ... 
    cart = session[:cart] ||= Cart.new 
    ... 
end 

的情況下運行時,它會創建一個新的車,而不是(從第二個呼叫開始)從會話採摘一起來。任何人都知道如何解決該問題?

我在軌道上2.2.2,黃瓜0.3.98,webrat 0.4.4

附: 可能將硒添加到電路中可能會有所幫助。但是,由於初步試圖獲得黃瓜/ selenuim工作沒有成功,我認爲有一點呼籲智慧是爲了站起來對付'黑暗力量'的東西,從來沒有工作'

+0

是否應該像car = session [:cart]一樣工作|| Cart.new? – cite 2009-09-11 04:26:37

+0

是的,除此之外,如果後者未定義,它還會將Cart.new分配給會話[:cart] – artemave 2009-09-11 11:43:54

回答

0

在這種方式Webrat模擬一個用於測試應用程序的瀏覽器,您不會得到任何會話支持。這意味着在會話散列中存儲信息適用於當前請求,但是信息不會被存儲用於後續請求。

根據在前面的場景中創建的會話不是真正的測試方法。您創建的每個場景都應該是自包含的。在「給定」步驟中,您應該確保滿足步驟的先決條件,如果這包括設置購物車,則應該這樣做。

另一個技巧:可以將多個鑑於/時/然後在一個場景塊,如果你想進一步測試,一旦你做了一些說法:

Scenario: Foobar 
Given the cart exists 
When I click checkout 
Then I should see '$100' 
When I click 'Pay' 
Then I should see 'Paid' 

似乎很有誘惑力的串聯所有你的情況的一個,但是一旦場景失敗,這使得更難調試你的應用程序。我更喜歡很多短的場景!

+0

>根據前一個場景中創建的會話不是真正測試約定的好方法。這就是爲什麼它依賴於(試圖)在上一步中創建的會話。 >在「給定」步驟中,您應確保滿足步驟的先決條件,如果這包括設置購物車,則應該這樣做。 這正是我想要實現的。 – artemave 2009-09-18 10:34:39

0

因爲黃瓜模擬您的瀏覽器,所以沒有一個乾淨的方法來做到這一點。你所有的瀏覽器都知道會話是一個不透明的cookie,禮貌地變成每個請求的哈希。

最好的解決方案是讓您的應用程序以通常的方式創建購物車,即登錄,選擇產品並將其添加到購物車。這一切都可以一步完成,但我會分步完成,因爲它是可重複使用的,也是因爲它更貼近用戶可能做的事情。

Scenario: Foobar 
    Given I am a logged in user 
    And I add a "wizbang" to my cart 
    When I click checkout 
    Then I should see '$100' 
    When I click 'Pay' 
    Then I should see 'Paid' 

如果問題是保持步驟之間的信息,您可以使用IVars,它將持續貫穿整個senario。即:

@cart ||= Cart.new 
+0

我不明白。黃瓜當然會在步驟之間保留(模擬?無論......)會話。否則'wizbang'會在結帳時從購物車中消失。那麼爲什麼不讓它可用?就像在普通的舊測試::單元::測試案例 – artemave 2009-09-24 10:53:18

+0

正確的步驟通過鏈接的問題是,網頁瀏覽是非常有限的瀏覽頁面元素。比方說,你有兩個產品(麪包和黃油)的列表,在每行中都有'加入購物車'按鈕。現在嘗試添加2個麪包和3個黃油。祝你好運與webrat – artemave 2009-09-24 11:04:28

+0

所以我插入硒在那裏他們有xpath選擇器(非常有幫助!)。硒無疑是一種更接近現實的方式。但方式更慢...一切都以一個價格! – artemave 2009-09-24 11:07:17