Как получить доступ к методу контроллера из теста Cucumber или альтернатив?

У меня есть приложение с моделью пользователя, и пользователи имеют разные роли. Роли представлены внутри как целочисленные индексы, но представлены пользователю как строки. У меня также есть вспомогательная функция access_levelapplication_controller.rb - это подходящее место для нее?), которая принимает либо целочисленный индекс, либо строковое представление и возвращает хэш множества информации о роли (включая строковое представление и индекс, так что это удобный способ преобразования между ними). Если это имеет значение, access_level, в свою очередь, зависит от определений ролей, определенных в файле в config\initializers.

Поскольку интерфейс, представляемый пользователю, зависит от роли, в моих тестах есть много вещей, таких как Given I have the role of administrator и тому подобное. Я пытаюсь создать пользователя с FactoryGirl.create(:user, role: access_level(role).index), но не могу заставить Cucumber увидеть access_level.

Большинство советов, которые я нахожу в Google, говорят «не делайте этого», потому что вызов функций за кулисами нарушает принцип сохранения Cucumber на уровне пользовательского интерфейса, но я не вижу способа проверить это поведение пользователя без ведома Cucumber. как сопоставить имена ролей с индексами. Конечно, я мог бы продублировать access_level в одном из файлов поддержки Cucumber, но это нарушает DRY. Итак, как следует структурировать это так, чтобы можно было чисто протестировать его в Cucumber?


person digitig    schedule 01.09.2014    source источник


Ответы (2)


Драйверы Cucumber имитируют браузер, поэтому определения шагов не имеют экземпляра контроллера или доступа к методам экземпляра контроллера.

Самый простой способ сделать этот метод контроллера доступным для определений шагов Cucumber — сделать его методом класса и вызвать его с помощью ApplicationController.access_level. Однако это было бы неприлично, так как определения шагов зависели бы от класса, о котором они не должны знать.

Вместо этого поместите код, который вы хотите использовать как в своем приложении, так и в определениях шагов Cucumber, в модуль и включите этот модуль в ApplicationController и в мир Cucumber.

В приложении/модели/access_control.rb:

module AccessControl
  def access_level(role)
    # do whatever is necessary
  end
end

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

В приложении/контроллеры/application_controller.rb:

class ApplicationController < ActionController::Base
  include AccessControl
  # ...
end

В функциях/support/env.rb:

World AccessControl
person Dave Schweisguth    schedule 03.09.2014

Меня учили, что сценарии Cucumber должны воспроизводить поведение пользователей. Но это не отменяет того факта, что вам нужно создать определенных пользователей с определенными ролями для тестирования. Отделение нашей автоматизации от кода сайта не дает нам роскоши/искушения использовать существующие методы контроллера. :) Рассматривали ли вы возможность создания фабрики для ролей, которая будет использоваться вашей пользовательской фабрикой? Я не уверен, насколько громоздким это было бы в вашей ситуации или сколько ролей вам нужно было бы создать.

person Jarod Adair    schedule 02.09.2014
comment
Всего несколько ролей, и я использую FactoryGirl для генерации пользователей, так что это возможно. Имейте в виду, я еще не проверял, может ли FactoryGirl видеть access_levels, поэтому мне вполне может понадобиться решение Дейва Швайсгута, даже если я пойду по этому пути. - person digitig; 03.09.2014
comment
Если вы пойдете по пути FactoryGirl, можете ли вы использовать черты для установки необходимых вам параметров уровня доступа? Это может потребовать дополнительной работы, но тогда ваш тестовый код будет отделен от вашего приложения. - person Jarod Adair; 04.09.2014
comment
Я мог бы использовать черты, да. Меня беспокоит то, что они сделают тесты хрупкими, потому что сопоставление между именами свойств и индексами, используемыми программой, может отличаться от сопоставления, используемого тестами. Если я изменю индекс, который соответствует какому-то имени, это должно сломать только модульный тест, проверяющий это сопоставление, но если я использую черты FG, такое изменение нарушит почти все тесты. - person digitig; 04.09.2014