【问题标题】:session[] doesn't persist across cucumber stepssession[] 不会在黄瓜步骤中持续存在
【发布时间】:2009-09-10 22:21:57
【问题描述】:

每次这一步

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

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

我在 Rails 2.2.2,黄瓜 0.3.98,webrat 0.4.4

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

【问题讨论】:

  • 这应该像 car = session[:cart] ||新购物车?
  • 是的,但如果后者未定义,则另外将 Cart.new 分配给 session[:cart]

标签: ruby-on-rails cucumber integration-testing


【解决方案1】:

在 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'

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

【讨论】:

  • > 取决于在先前场景中创建的会话并不是测试同意的好方法。这就是为什么它依赖(尝试)在上一步中创建的会话。 > 在“给定”步骤中,您应该确保满足这些步骤的先决条件,如果这包括设置购物车,您应该这样做。这正是我想要实现的目标。
【解决方案2】:

没有真正干净的方法可以做到这一点,因为 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。即:

@cart ||= Cart.new

【讨论】:

  • 我不明白。 Cucumber 肯定会在步骤之间保留(模拟?无论如何...)会话。否则,“wizbang”会在结账时从购物车中消失。那么为什么不让它可访问呢?就像在普通的旧 Test::Unit::TestCase
  • 正确通过链接的问题是 webrat 在浏览页面元素方面非常有限。比如说,您有一个包含两种产品(面包和黄油)的列表,每行都有“添加到购物车”按钮。现在尝试添加 2 个面包和 3 个黄油。祝你好运
  • 所以我在有 xpath 选择器的地方插入了 selenium(非常有帮助!)。 Selenium 绝对是一种更接近现实的方式。但是要慢一点……一切都是有代价的!​​span>
  • 回答您的第一条评论:Webrat 在请求之间保留 cookie,就像您的浏览器一样。会话是 Rails 的虚构。它查看发送的 cookie 并使用它来重现原始会话哈希的每个请求。默认情况下,Rails 压缩和加密会话哈希的编组转储并将其填充到 cookie 中,但它也可以将其从数据库或文件或内存缓存中提取出来,并将“密钥”令牌存储在 cookie 中。 webrat 所能做的就是返回给定的相同 cookie。
  • 回答您的第二条评论:Webrat 使用 nokogiri 进行所有解析。 nokigiri 有 CSS3 和 XPath 选择器,恕我直言,更有用的测试工具。默认的黄瓜步骤在选择链接时不会给您很大的权力,但是如果您使用 nokogiri 找到您的按钮并将其选择器传递给 Webrat,它也可以做正确的事情。如果您无法使其正常工作,请提出另一个问题,我会尝试在 500 多个字符内给出更完整的答案。
猜你喜欢
  • 2017-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-10
相关资源
最近更新 更多