1

私は次のようなキュウリのテストをしようとしています:

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のパラメーターを渡すことができるようにキュウリのステップを記述します

私が見たすべてのキュウリのチュートリアルは、このタイプのシナリオで一種の光沢があります-それは常にすべての記事のリストなどに行き、特定の詳細ページには行きません。

どんな助けでもいただければ幸いです。ありがとう!

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 値を作成するには、2 つの方法があります。1 つ目は、作成時に 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 に答える