我在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步骤?我是以错误的方式思考问题吗?
答案 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)