Rails огурец неинициализированная константа User (NameError) - PullRequest
0 голосов
/ 03 апреля 2020

Я начинаю с BDD (огурец + капибара + селеновый хромедривер) и TDD (rspe c) с factory_bot, и я получаю сообщение об ошибке с функциями огурца - step_definitions.

неинициализированная константа User (NameError)

С TDD все в порядке, заводской бот работает нормально. Проблема с огурцом.

factories.rb

FactoryBot.define do

    factory :user_role do
        name {"Admin"}
        query_name {"admin"}
    end

    factory :user do
        id {1}
        first_name {"Mary"}
        last_name {"Jane"}
        email {"mary_jane@gmail.com"}
        password {"123"}
        user_role_id {1}
        created_at {'1/04/2020'}
    end
end

support / env.rb

require 'capybara'
require 'capybara/cucumber'
require 'selenium-webdriver'
require 'factory_bot_rails'

Capybara.register_driver :selenium do |app|
    Capybara::Selenium::Driver.new(app, browser: :chrome)
end

Capybara.configure do |config|
    config.default_driver = :selenium
end

Capybara.javascript_driver = :chrome

World(FactoryBot::Syntax::Methods)

И проблема здесь происходит

support / hooks.rb

Before '@admin_login' do
    @user = create(:user)
end

step_definitions / admin_login.rb

Given("a registered user with the email {string} with password {string} exists") do |email, password|
    @user
end

Я не знаю почему, но я не могу получить доступ к пользователю, используя cucumber и factory_bot.

Кто-нибудь может мне помочь, пожалуйста?

Я думаю, мне нужно что-то настроить на огурец.

Как вы думаете, ребята?


Ответы [ 2 ]

0 голосов
/ 04 апреля 2020

Прежде всего, Люк прав в том, что это проблема установки. Ошибка говорит вам, что модель User не может быть найдена, что, вероятно, означает, что Rails еще не загружен. Я не могу вспомнить точные детали того, как работают огурцы-рельсы, но одна из вещей, которые он делает, - убедиться, что каждый сценарий становится расширением интеграционного теста Rails. Это гарантирует, что вся автоматическая загрузка Rails состоялась и что эти вещи доступны.

Во-вторых, я бы посоветовал вам начать проще и использовать шаг для создания зарегистрированного пользователя вместо использования тега. Использование меток для установки является Огурцы антишаблоном.

1004 * И, наконец, более спорно, я бы предположить, что вы не используете заводскую-бот, когда cuking. FactoryBot использует отдельную конфигурацию для создания объектов модели непосредственно в хранилище данных. Это обходит любые логики приложения c вокруг создания этих объектов, что означает, что объекты, созданные FactoryBot, в конечном итоге будут отличаться от объектов, созданных вашим приложением. В реальной жизни создание объектов включает в себя такие вещи, как аудит, отправка электронных писем, условная логика c и c. и др c. Чтобы использовать FactoryBot, вы должны либо дублировать эту дополнительную логику создания c и поведение, либо игнорировать ее (оба варианта нежелательны).

Вы можете создавать объекты для более эффективного (и более быстрого) уничтожения, используя следующие pattern.

Каждый метод create в контроллере Rails делегирует свою работу сервисному объекту, например,

UserController
  def create
    @user = CreateUserService.new(params).call
  end
end

Затем пусть ваши cukes используют вспомогательный модуль для создания вещей для вас. Этот модуль предоставит инструменты для ваших шагов по созданию пользователей, используя вышеуказанный сервис

module UserStepHelper
  def create_user(params)
    CreateUserService.new(default_params.merge(params))
  end

  def default_params
    {
      ...
    }
  end
end
World UserStepHelper

Given 'there is a registered user' do
  @registered_user = create_user
end

, а затем используйте этот шаг в фоновом режиме вашей функции, например

Background: 
  Given there is a registered user
  And I am an admin

Scenario: Admin can see registered users
  When I login and view users
  Then I should see a user

Обратите внимание на отсутствие пометка здесь. Это нежелательно или не нужно здесь.

Вы можете увидеть расширение этого подхода в примере приложения, которое я сделал для выступления с CukeUp в 2013 году, здесь https://github.com/diabolo/cuke_up/commits/master. Если вы выполните этот коммит путем коммита, начиная с первого комета внизу, вы получите довольно хорошее руководство по настройке проекта rails с огурцом всего за первые 4 или 4 коммита. Если вы выполните его до конца (22 коммита), вы получите мощную основу c для создания и использования объектов модели при наведении. Я понимаю, что проект древний, и, очевидно, вам придется использовать современные версии всего, но принципы все еще применяются, и я использую этот подход во всей своей работе, и я делал это по крайней мере 10 лет.

0 голосов
/ 03 апреля 2020

Так что, если вы используете рельсы, вероятно, рекомендуется использовать огурцы-рельсы над огурцом. Вероятно, это проблема, когда ваши пользовательские модели не были автоматически загружены.

Cucumber автоматически загружает все ruby файлы под функциями, в первую очередь с env.rb, это почти наверняка проблема с порядком загрузки / место загрузки

...