Cucumber和webrat - 如何处理paths.rb中的动态URL?

时间:2010-01-15 19:41:57

标签: ruby-on-rails cucumber webrat

我在Ruby on Rails项目中使用Cucumber进行BDD开发,我对于path.rb如何处理rails应用程序中使用的路径感到困惑。

鉴于我有:

class Parent < ActiveRecord::Base
  has_many :children
end

class Child < ActiveRecord::Base
  belongs_to :parent
end

我有以下黄瓜功能:

Scenario: A test feature
    Given I am on the parent page
     When I follow "Link to Children"
     Then I should be on the children list page

路径定义为:

def path_to(page_name)
  case page_name
  when /the children list page/
       '/parents/:id/children'
end

我遇到的问题是运行该功能时出现以下错误:

Spec::Expectations::ExpectationNotMetError: expected: "/parents/:id/children",
 got: "/parents/1726/children" (using ==)

我真的不在乎:id是什么。我该怎么做呢?这是否可以使用默认的Web步骤?我是以错误的方式思考问题吗?

2 个答案:

答案 0 :(得分:18)

我这样做的方式可能不是最好的方法如下:

when /the children list page for "(.+)"/
    p = Parent.find_by_name($1)
    parent_children_path(p)

答案 1 :(得分:2)

在我们的应用程序中,每当用户单击“新建”按钮时,我们总是希望数据库中有新记录。因此,我们的控制器的新操作会自动调用create,然后重定向到编辑操作。

我们在测试中遇到了类似的问题,当时我们并不关心ID是什么 - 只是它进入了应用程序的编辑页面。

这就是我想出来的。

(注意:步骤定义是使用 capybara 编写的,但它不应与webrat有太大差别)

Then /^(?:|I )should now be editing the (.*)$/ do |model|
  id = find_by_id("#{model}_id").value
  Then "I should be on the edit #{model} page for \"#{id}\""
end

基本前提是,当您在Rails编辑页面上时,将会有一个您正在编辑的模型的表单。该表单始终包含一个隐藏字段,其中包含您正在编辑的特定记录的ID。

该步骤找到隐藏字段,从中提取ID,然后查找web_step以解析该模型的路径。

确保您有一条与您正在查找的模型匹配的路径。

when /the edit person page for "([^\"]*)"/
  edit_person_path($1)