Как отладить FactoryGirl.create ошибки обратного вызова в Rails? - PullRequest
0 голосов
/ 09 января 2019

Первая проблема заключается в том, что FactoryGirl показывает сообщение об ошибке, но не говорит, где происходит, файл и строка:

У меня есть byebug в очень простом spec файле:

RSpec.describe Site::HomeHelper, type: :helper do
  describe 'html meta description for products page' do
    context 'without categories' do
      it 'should return the family name and preference.meta_desc' do
        byebug
      end
    end
  end
end

А тут работает бебуг, потом в консоли пытаюсь:

(byebug) FactoryGirl.create(:user_with_one_company)

и сообщение об ошибке

*** NoMethodError Exception: undefined method `zero?' for nil:NilClass

Но я не знаю, где

Затем, пытаясь решить эту проблему, я поставил byebug во всех местах, которые, как мне кажется, могут вызвать эту ошибку, но я понял, что с FactoryGirl.create(:model) byebug не срабатывает (я почти уверен в прошлое могло использовать это)

Так что, например, в просто работающем коде вот так

(byebug) FactoryGirl.create(:user).activation_code

с моделью пользователя:

  class User < ApplicationRecord
    before_create :set_activation_code
    private

    def set_activation_code
      byebug
      self.activation_code = 'IT IS EXECUTED'
    end

Я получаю

(byebug) FactoryGirl.create(:user).activation_code
"IS EXECUTED"

и byebug не выполняется , программа не останавливается

Я проверил Gemfile, чтобы проверить, не было ли у меня некоторых гемов, не входящих в группы разработки или тестирования, и я думаю, что все в порядке:

group :development, :test do
  gem 'byebug', platforms: %i[mri mingw x64_mingw]
  gem 'database_cleaner'
  gem 'rspec-rails', '~> 3.6.0'
  gem 'spring'
  gem 'spring-commands-rspec'
  gem 'spring-watcher-listen', '~> 2.0.0'
  gem 'factory_girl_rails' #, '4.8.0'
end

group :test do
  gem 'capybara'
  gem 'selenium-webdriver'
  gem 'launchy'
  gem 'rails-controller-testing' # => 'assert_template'
  gem 'shoulda-matchers', '~> 3.1'
end

Я думаю, что упускаю что-то очевидное. Спасибо


Отредактировано -> Заводской код:

FactoryGirl.define do
  factory :user, class: Constructor::User do
    password 'Elsevier'
    password_confirmation 'Elsevier'
    sequence(:name) { |n| "Pep#{n}" }
    sequence(:email) { |n| "pep#{n}@gmail.com" }

    factory :user_without_password_confirmation do
      password_confirmation 'ElsevXXX'
    end
    ...
  end
end

1 Ответ

0 голосов
/ 10 января 2019

Решением, которое я нашел, является выполнение FactoryGirl.create... из rails console. Здесь я вижу следы ошибок, а также имею доступ к byebug без проблем.

Для этого просто имейте в виду две вещи:

  • factory_girl_rails гем должен находиться в группе разработчиков в Gemfile

    group :development, :test do' gem 'byebug', platforms: %i[mri mingw x64_mingw] ... gem 'factory_girl_rails

  • при выполнении FactoryGril.create ... в пределах rails console таблицы не сбрасываются автоматически, как это происходит при выполнении тестов

...