FactoryBot — показать все поля моего объекта User

#ruby-on-rails #rspec #factory-bot

#ruby-on-rails #rspec #factory-бот

Вопрос:

Моя фабрика:

   factory :user_blocked, class: User do
    name { 'Test' }
    login { 'mylogin' }
    uid { 'mylogin' }
    password { 'test' }
    password_confirmation { 'test' }
    locked_at { nil }
    trait :lock do
      locked_at { Time.now.utc }
    end
    association :customer, factory: :customer
  end
  

В моем тесте я создал нового пользователя:

 let(:user) { create(:user_blocked) }
  

Но в моем объекте user не отображается мое поле locked_at

Почему это происходит?

Комментарии:

1. Вы использовали FactoryGirl.create(:user_blocked, : lock) при создании user?

2.Привет! В этом случае я хочу, чтобы это поле :locked_at было равно нулю .

Ответ №1:

Во-первых, как предположил Билли, ваша фабрика названа :user_blocked , во-вторых, ваше locked_at значение задается с помощью «признака» с именем :lock .

Итак, чтобы создать пользователя со значением «locked_at», измените свой код на:

let(:user) { create(:user_blocked, :lock) }

Вот ссылка на описание функции FactoryBot «trait»: https://github.com/thoughtbot/factory_bot/blob/master/GETTING_STARTED.md#traits

Комментарии:

1. Привет! Да, вы и Билли правы, когда я писал вопрос, не указывайте правильного пользователя, извините. Но я хотел бы сначала получить это поле:locked_at как nill, а в других случаях я устанавливаю:lock

Ответ №2:

В вашем коде вы создаете объект на основе :user фабрики, но фабрика, к которой вы добавили locked_at , называется :user_blocked . Изменить

let(:user) { create(:user) }

Для

let(:user) { create(:user_blocked) }

Комментарии:

1. Привет, Билли! Когда я писал вопрос, я не написал правильного пользователя, извините. Несмотря на это, я хочу получить поле как нулевое значение, но это поле не отображается в моем созданном объекте: user_blocked .

Ответ №3:

Судя по вашим комментариям, проблема не в вашей фабрике. Похоже, вы используете lockable модуль Devise. «locked_at» помечено как «небезопасное» поле в пользовательской модели. Это означает, что если вы распечатаете user.attributes , вы не увидите locked_at, независимо от того, имеет он значение или нет. Это можно проиллюстрировать следующим примером rspec:

 describe "lockable" do
  subject(:user) { create(:user_blocked) }

  it "does not serialize locked_at" do
    expect(user.attributes).not_to include(locked_at: nil)
  end

  it "defaults locked_at to nil" do
    expect(user.locked_at).to be_nil
  end
end
  

Комментарии:

1. Привет, Тони! Да, я использую Devises Gem, но когда я печатаю user.attributes, он отображает все поля, включая «locked_at» => nil Я думаю, вы правы, говоря, что блокируемый модуль помечен как «небезопасный», но я не знаю, как это решить.

2. Есть ли неисправный тест, который вы пытаетесь исправить?

3. Нет, я создаю тест для действия, и это поле необходимо, независимо от того, является ли оно нулевым или заполненным.