1

我正在尝试进行一些 Cucumber 测试,如下所示:

Given I am logged in as admin
When I go to the article page
Then I should see "Edit Article"
And I should see "Article Title"

文章页面的路径是“articles/1”或某个已知 ID。问题是当我使用我的步骤定义插入数据时

Article.create(:name => "Article Title")

我无法提前知道插入记录时的 id 是什么。

本质上,我要么需要

a) 能够插入可预测的 ID。我已经尝试过这个问题的答案中提到的方法,但它似乎对我不起作用——它总是插入一个不同的 id。

或者

b)以这样一种方式编写我的黄瓜步骤,以便我可以为我的文章 ID 传递一个参数

我见过的所有 Cucumber 教程都对这种场景进行了掩饰——它总是进入所有文章的列表或其他任何内容,而不是特定的详细信息页面。

任何帮助,将不胜感激。谢谢!

4

4 回答 4

4

以用户的方式导航到文章页面怎么样?你的脚步

When I go to the article page

可以改为

When I go to the page for the "Article Title" article

并且您的步骤定义转到文章概述,找到带有“文章标题”的链接并以这种方式导航到页面。

您可以获得更多的测试覆盖率,并且不必担心 ID。

于 2009-07-03T15:21:48.100 回答
3

有两种方法可以创建可预测的 ID 值。第一种是在创建时手动设置ID:

model = Model.new(options)
model.id = DESIRED_ID
model.save

这里的问题是传递给 new、create 或 update_attributes 的选项不会影响 id 值,这就是不幸的是,需要调用 model.id 的原因。

另一种方法是在运行测试之前重置整个表。如果需要,这可以更改以考虑固定装置。例如:

class Model < ActiveRecord::Base
  def self.reset!
    connection.execute("DELETE FROM #{table_name}")
    connection.execute("ALTER TABLE #{table_name} AUTO_INCREMENT=1")
  end
end

这会将插入的第一行的 ID 设置为可预测的 1。

于 2009-07-03T15:16:14.587 回答
1

如何让“转到文章页面”转到“/articles/#{Article.first.id}”

于 2009-07-03T21:01:42.883 回答
0

这就是我使用的:

# feature
Scenario: creator archives fragment
  When fragment 1 exists
  And I am the fragment owner
  And I am on fragment 1

#steps
def create_fragment(attribs)
  force_id = attribs[:force_id]
  attribs.delete(:force_id) if force_id
  fragment = Fragment.create!({ :owner_id => @current_user.id, :originator_id => @current_user.id}.merge(attribs))
  if force_id
    fragment.id = force_id.to_i
    fragment.save!
  end
  fragment
end

When /^fragment (.*) exists$/ do |frag|
  @fragment = Fragment.find_by_id(frag)
  @fragment.destroy if @fragment
  @fragment = create_fragment(:force_id => frag.to_i,:description => "test fragment #{frag}",:narrative => "narrative for fragment #{frag}")
end


# paths.rb
when /fragment (.*)/
fragment_path($1)

玩得开心。

于 2010-03-12T17:28:12.847 回答