Как вставить предсказуемые идентификаторы для тестирования с помощью ActiveRecord

StackOverflow https://stackoverflow.com/questions/1079619

Вопрос

Я пытаюсь провести тестирование 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» или какой-либо известный идентификатор. Проблема в том, что когда я вставляю свои данные, используя определение шага

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

Я не могу заранее знать, каким будет идентификатор, когда запись будет вставлена.

По сути, мне либо нужно

а) иметь возможность вставлять предсказуемые идентификаторы.Я попробовал метод, упомянутый в ответ на этот вопрос но у меня это не работает - всегда вставляет другой идентификатор.

или

б) напишите мои шаги по огурцу таким образом, чтобы я мог передать параметр для своего идентификатора статьи

Все учебные пособия по Cucumber, которые я видел, как бы замалчивают этот тип сценария - он всегда идет к списку всех статей или чего-то еще, а не к конкретной странице с подробными сведениями.

Любая помощь будет оценена по достоинству.Спасибо!

Это было полезно?

Решение

Существует два способа создания предсказуемых значений идентификаторов.Первый — вручную установить идентификатор при создании:

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

Это установит идентификатор первой вставленной строки как предсказуемый 1.

Другие советы

Как насчет перехода на страницу статьи так, как это сделал бы пользователь?Ваш шаг

When I go to the article page

можно было бы изменить на

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

и ваше определение шага переходит к обзору статьи, находит ссылку с «Названием статьи» и таким образом переходит на страницу.

Вы получаете больше возможностей для тестирования и вам не нужно беспокоиться об идентификаторах.

Как насчет того, чтобы «Перейти на страницу статьи» перейти на «/articles/#{Article.first.id}»

Это то, что я использую:

# 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)

Веселиться.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top