#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. Нет, я создаю тест для действия, и это поле необходимо, независимо от того, является ли оно нулевым или заполненным.