Как да получите достъп до метод на контролер от тест 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.

Повечето от съветите, които откривам чрез гугъл, гласят „не правете това“, защото извикването на функции зад кулисите нарушава принципа за поддържане на Cucumber на ниво потребителски интерфейс, но не виждам начин да тествам това потребителско поведение, без Cucumber да знае как да картографирате имена на роли към индекси. Бих могъл да дублирам access_level в един от моите файлове за поддръжка на Cucumber, разбира се, но това нарушава DRY. И така, как трябва да структурирам това по такъв начин, че да мога да го тествам чисто в Cucumber?


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


Отговори (2)


Драйверите на Cucumber симулират браузър, така че дефинициите на стъпките нямат екземпляр на контролер или достъп до методи на екземпляр на контролер.

Най-лесният възможен начин да направите този метод на контролера достъпен за дефинициите на стъпка на Cucumber би бил да го направите метод на клас и да го извикате с ApplicationController.access_level. Това обаче би било неприятно, тъй като ще направи дефинициите на стъпките зависими от клас, за който те не трябва да знаят.

Вместо това поставете кода, който искате да използвате както във вашето приложение, така и в дефинициите на стъпки на Cucumber, в модул и включете този модул в ApplicationController и в света на Cucumber.

В app/models/access_control.rb:

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

(Предположих, че трябва да е в директорията на моделите, защото ми се струва, че е проблем на ниво модел, но това не е критично.)

В app/controllers/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, така че в крайна сметка може да се окажа нужда от решението на Dave Schweisguth, дори ако тръгна по този път. - person digitig; 03.09.2014
comment
Ако тръгнете по пътя на FactoryGirl, бихте ли могли да използвате черти, за да зададете параметрите на нивото на достъп, от които се нуждаете? Това може да е допълнителна работа, но ще запази тестовия ви код отделен от вашето приложение. - person Jarod Adair; 04.09.2014
comment
Мога да използвам черти, да. Притеснението ми е, че те биха направили тестовете крехки, защото картографирането между имената на характеристиките и индексите, използвани от програмата, може да се разминава с картографирането, използвано от тестовете. Ако променя индекса, който съвпада с някое име, той трябва да развали само единичния тест, който проверява това картографиране, но ако използвам черти на FG, такава промяна би развалила почти всички тестове. - person digitig; 04.09.2014