Factory_bot не может создать фабрику "проекта" - PullRequest
0 голосов
/ 22 января 2019

Я пишу несколько фабрик в рамках своего проекта. Все они работают, кроме project фабрики.

Когда я запускаю фабрику в консоли rails, я получаю следующую ошибку

FactoryBot.create(:project)
NoMethodError: undefined method `name' for :project:Symbol from /home/user/.rvm/gems/ruby-2.3.6/gems/factory_bot-4.11.1/lib/factory_bot/declaration/implicit.rb:11:in `=='

Кажется, что factory_bot каким-то образом не может преобразовать символ: проект в свой класс Project.

Версия Ruby - 2.3.6. Factory_bot - это 4.11.1. Factory_bot_rails - это тоже 4.11.1.

Это файл фабрики моего проекта:

require 'faker'

FactoryBot.define do
  factory :project do
    name                              { Faker::Company.name }
    product_type                      { Faker::Number.between(0, 1) }
    sale_type                         { Faker::Number.between(0, 1) }
    description                       { Faker::Lorem.sentence }
    street                            { Faker::Address.street_name }
    neighborhood                      { Faker::Address.community }
    zip_code                          { Faker::Address.zip }
    country                           { Faker::Address.country_code }
    state                             { Faker::Address.state_abbr }
    city                              { Faker::Address.city }
    town                              { Faker::Address.city }
    logo                              { Faker::Company.logo }
    cover                             { Faker::Company.logo }
    send_from_email                   { Faker::Internet.email }
    parking_lot_cost                  { Faker::Number.decimal(2) }
    warehouse_m2_cost                 { Faker::Number.decimal(2) }
    association :client, factory: user
    inventory_dimension_value         { Faker::Number.digit }
    total_m2                          { Faker::Number.decimal(2) }
    sales_volume_total                { Faker::Number.decimal(2) }
    total_units                       { Faker::Number.digit }
    current_m2_sold                   { Faker::Number.decimal(2) }
    sales_volume_current_sold         { Faker::Number.decimal(2) }
    current_units_sold                { Faker::Number.digit }
    sales_volume_to_sell              { Faker::Number.decimal(2) }
    next_list_acum                    { Faker::Number.decimal(2) }
    from_email                        { Faker::Internet.email }
    saved_next_list_acum              { Faker::Number.decimal(2) }
    settings_show_distributions_cols  { Faker::Boolean.boolean }
    settings_price_list_v2_enabled    { Faker::Boolean.boolean }
    api_token                         { Faker::Lorem.word }
  end
end

Редактировать: это схема базы данных для таблицы проектов

                                                   Table "public.projects"                                                    
              Column              |            Type             | Collation | Nullable |               Default                
----------------------------------+-----------------------------+-----------+----------+--------------------------------------
 id                               | integer                     |           | not null | nextval('projects_id_seq'::regclass) 
 name                             | character varying           |           |          |                                      
 product_type                     | integer                     |           |          |                                      
 sale_type                        | integer                     |           |          |                                      
 description                      | text                        |           |          |                                      
 street                           | character varying           |           |          |                                      
 neighborhood                     | character varying           |           |          |                                      
 zip_code                         | character varying           |           |          |                                      
 country                          | character varying           |           |          |                                      
 state                            | character varying           |           |          |                                      
 city                             | character varying           |           |          |                                      
 town                             | character varying           |           |          |                                      
 logo                             | character varying           |           |          |                                      
 cover                            | character varying           |           |          |                                      
 send_from_email                  | text                        |           |          |                                      
 parking_lot_cost                 | double precision            |           |          | 0.0                                  
 warehouse_m2_cost                | double precision            |           |          | 0.0                                  
 created_at                       | timestamp without time zone |           | not null |                                      
 updated_at                       | timestamp without time zone |           | not null |                                      
 client_id                        | integer                     |           |          |                                      
 inventory_dimension_value        | integer                     |           |          |                                      
 total_m2                         | double precision            |           |          | 0.0                                  
 sales_volume_total               | double precision            |           |          | 0.0                                  
 total_units                      | integer                     |           |          | 0                                    
 current_m2_sold                  | double precision            |           |          | 0.0                                  
 sales_volume_current_sold        | double precision            |           |          | 0.0                                  
 current_units_sold               | integer                     |           |          | 0                                    
 sales_volume_to_sell             | double precision            |           |          | 0.0                                  
 next_list_acum                   | double precision            |           |          | 0.0                                  
 from_email                       | character varying           |           |          |                                      
 saved_next_list_acum             | double precision            |           |          |                                      
 settings_show_distributions_cols | boolean                     |           |          | true                                 
 settings_price_list_v2_enabled   | boolean                     |           |          | false                                
 api_token                        | character varying           |           |          |                                      

Ответы [ 2 ]

0 голосов
/ 18 февраля 2019

Похоже, вы ссылаетесь на association :client, factory: user вместо association :client, factory: :user (:user должен быть символом).

Это довольно бесполезное сообщение об ошибке.Мы немного улучшили сообщение об ошибке в https://github.com/thoughtbot/factory_bot/pull/1219,, и у нас есть открытая проблема, чтобы улучшить его еще: https://github.com/thoughtbot/factory_bot/issues/1227.

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

Попробуйте объявить имя класса в описании фабрики.

  FactoryBot.define do
    factory :project, class: 'Project' do
    ...

Я создал фабрику в существующем проекте, используя тот же код, и получил точно такую ​​же ошибку. Затем я изменил название фабрики на :projector и снова получил ту же ошибку. Поэтому это не проблема защищенного имени.

Мои лучшие догадки:

1) Обязательно ли переносить тестовую базу данных после добавления проектов?

2) Вы уверены, что ваше приложение подключается к той же БД, что и в списке?

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

NoMethodError: undefined method `name=' for #<Report:0x00007fc5bb065c10>

Таким образом, фабрика не может подтвердить символ, который вам дан, что, скорее всего, означает, что она не распознает его как константу / класс.

...