Невозможно построить отношение has_and_belongs_to_many в Rspec с FactoryBot - PullRequest
0 голосов
/ 23 октября 2018

Я читаю документацию FactoryBot здесь: https://www.rubydoc.info/gems/factory_bot/file/GETTING_STARTED.md

У меня есть пользователи и роли, и это отношение has_and_belongs_to_many.Я пробовал много шагов из документации, чтобы установить это отношение, но ничего не работает.

Сначала я попробовал эту технику:

FactoryBot.define do
  factory :role do
    name { "marketing" }

    factory :admin_role do
      name { "admin" }
    end
  end
end

FactoryBot.define do
  factory :user, aliases: [:marketing] do
    email { 'marketing@mysite.io' }
    password { '123456' }
    password_confirmation { '123456' }
    association :role
  end
end

Но она дает мне:

NoMethodError: undefined method `role=' for #<User:0x007f9743449198>

Во-вторых, я попробовал эту технику:

FactoryBot.define do
  factory :role do
    name { "marketing" }

    factory :admin_role do
      name { "admin" }
    end
  end
end

FactoryBot.define do
  factory :user, aliases: [:marketing] do
    email { 'marketing@mysite.io' }
    password { '123456' }
    password_confirmation { '123456' }
    role
  end
end

Но снова я получаю эту ошибку:

NoMethodError: undefined method `role=' for #<User:0x007f9743449198>

В-третьих, я попробовал эту технику множественного отношения:

FactoryBot.define do
  factory :role do
    name { "marketing" }

    factory :admin_role do
      name { "admin" }
    end
  end
end

FactoryBot.define do
  factory :user, aliases: [:marketing] do
    email { 'marketing@mysite.io' }
    password { '123456' }
    password_confirmation { '123456' }
    role
  end
end

Я получаю эту ошибку:

ArgumentError: Trait not registered: roles

Тем не менее, когда я читаю документацию, он предлагает использовать эти методы.Так что я делаю не так?

1 Ответ

0 голосов
/ 23 октября 2018

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

FactoryBot.define do
  factory :user, aliases: [:marketing] do
    email { 'marketing@mysite.io' }
    password { '123456' }
    password_confirmation { '123456' }
    roles { [ role ] }
  end
end

или

FactoryBot.define do
  factory :user, aliases: [:marketing] do
    email { 'marketing@mysite.io' }
    password { '123456' }
    password_confirmation { '123456' }
    roles { [ create(role) ] }
  end
end

Причинаиз-за вашей ошибки вы не можете позвонить @user.role, но вы можете позвонить @user.roles с отношением HABTM.

...