Как вставить предсказуемые идентификаторы для тестирования с помощью ActiveRecord
-
21-08-2019 - |
Вопрос
Я пытаюсь провести тестирование 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)
Веселиться.