4

我正在尝试学习如何使用 Cucumber 并使用以下场景创建步骤(我有一个名为“Vegetable”的模型,并且我添加了一个名为“color”的新属性):

Scenario: add color to existing vegetable
  When I go to the edit page for "Potato"
  And I fill in "Color" with "Brown"
  And I press "Update Vegetable Info"
  Then the color of "Potato" should be "Brown"

我目前正在使用“训练轮”,所以我有一个网络步骤(web_steps.rb):

When /^(?:|I )go to (.+)?/ do |page_name|
  visit path_to(page_name)
end

现在我明白了它是如何与简单的页面导航一起工作的,例如“当我转到蔬菜主页时”。我所要做的就是添加paths.rb的路径:

When /^the vegetable home page/
  '/vegetables'

但是,对于上面的示例,我需要使用特定的蔬菜“/vegetables/1”(Potato url)进入特定路径。

我不知道该怎么做,所以我尝试创建自己的步骤:

When /I go to the edit page for "(.*)"/ do |vegetable_name|
  flunk "Unimplemented"
end

但我得到了错误:

Ambiguous match of "I go to the edit page for "Potato"":

features/step_definitions/vegetable_steps.rb:15:in `/go to the edit page for "(.*)"/'
features/step_definitions/web_steps.rb:48:in `/^(?:|I )go to (.+)$/'

You can run again with --guess to make Cucumber be more smart about it
   (Cucumber::Ambiguous)

这是我应该这样做的吗?还是我只是使用 web_steps “转到”步骤并以某种方式在 paths.rb 文件中提供 id?在阅读了各种 Cucumber 教程数小时后,我只是想弄清楚如何开始这个。

4

2 回答 2

10

正如 DVG 所说,这是因为我在两个地方都有匹配步骤,所以我收到了错误。要回答我自己的问题,我可以依靠已经提供的“web_step”:

When /^(?:|I )go to (.+)?/ do |page_name|
  visit path_to(page_name)
end

一旦我将以下代码添加到paths.rb:

def path_to(page_name)
  case page_name

  when /^the edit page for "(.*)"$/
    edit_vegetable_path(Vegetable.find_by_name($1))

我能够让它正常工作。

于 2012-06-21T16:49:45.373 回答
5

问题是您正在匹配步骤两个位置。步骤定义是全局的。因此,您必须更改功能以使用您没有写过两个地方的步骤或删除多余的步骤。

此外,您的功能是以非常低级别的 has-ui-details 方式编写的。这使您的功能难以应对变化,除非您的业务需求发生变化,否则您的黄瓜规格永远不会改变。考虑尝试

Given a vegetable named "Potato"
When I mark the vegetables color as "Brown"
Then the Potato should be "Brown"

通过这种方式,您可以在不更改规范的情况下自由地试验您的表单,这就是重点。

于 2012-06-21T02:46:56.307 回答