每次这一步
Given /blah.../
...
cart = session[:cart] ||= Cart.new
...
end
在一个场景中运行,它会创建一个新的购物车,而不是(从第二个调用开始)从会话中选择一个。谁知道如何解决这个问题?
我在轨道2.2.2,黄瓜0.3.98,webrat 0.4.4
P.S。 可能在电路中添加硒可能会有所帮助。但是,由于初步尝试获得黄瓜/ selenuim的工作并没有成功,我认为在对抗黑暗势力之前,有一点需要智慧,以便“永远不会工作的事情”
答案 0 :(得分: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'
将所有场景连接在一起似乎很诱人,但这会使场景失败后调试应用程序变得更加困难。我更喜欢很多简短的场景!
答案 1 :(得分: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'
如果问题是维护步骤之间的信息,您可以使用将在整个Senario中保留的IVars。即:
@cart ||= Cart.new