1

每次这一步

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

在一个场景中运行时,它会创建一个新的购物车,而不是(从第二次通话开始)从会话中挑选一个。任何人都知道如何解决这个问题?

我在 Rails 2.2.2,黄瓜 0.3.98,webrat 0.4.4

PS 可能在电路中添加硒可能会有所帮助。但是,由于让黄瓜/硒起作用的初步尝试没有成功,我认为在与“永远不会起作用的东西”的黑暗力量对抗之前,需要一点智慧的呼唤

4

2 回答 2

0

在 Webrat 模拟浏览器以测试您的应用程序的方式中,您没有获得任何会话支持。这意味着在会话哈希中存储信息适用于当前请求,但不会为后续请求存储信息。

依赖于在前一个场景中创建的会话并不是一个很好的测试方法。您创建的每个场景都应该是自包含的。在“给定”步骤中,您应该确保满足这些步骤的先决条件,如果这包括设置购物车,您应该这样做。

另一个提示:如果你想在做出一些断言后进一步测试,你可以在一个场景中连接几个 Given/When/Then 块:

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

将所有场景连接在一起似乎很诱人,但是一旦场景失败,这会使调试应用程序变得更加困难。我更喜欢很多简短的场景!

于 2009-09-18T07:55:49.170 回答
0

没有真正干净的方法可以做到这一点,因为 cucumber 正在模拟您的浏览器。你的浏览器所知道的所有会话都是一个不透明的 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'

如果问题是在步骤之间维护信息,您可以使用将在整个 senario 中持续存在的 Ivar。IE:

@cart ||= Cart.new
于 2009-09-24T05:33:53.403 回答