Обновление (не отвечайте)
Я только что узнал, что этот вопрос на самом деле не имеет смысла.Это было основано на моем собственном заблуждении о фабриках и о том, как они работают.
Вся идея была основана на неправильном представлении о том, как работает FactoryBot, в частности по какой-то причине я думал, что FactoryBot настраивает несколькопеременные, за которые фактически отвечал совершенно другой гем (Devise).
Есть ли простой способ получить доступ к «виртуальным атрибутам» для уже построенной фабрики?
Что-то вроде: attribute_for, ноиспользуется на экземпляре Фабрики вместо класса?
Так что вы можете сделать что-то вроде этого:
FactoryBot.define do
factory :user do
email { Faker::Internet.email }
password { "password" }
password_confirmation { "password" }
end
end
@user = FactoryBot.build(:user)
@user.factory_attributes # Not a real method
#-> { email: "name@gmail.com", password: "123456", password_confirmation: "123456" }
Почему я хочу это
Если вам интересно, я хочу, чтобы это было в состоянии сократить следующий код для спецификации запроса на вход в систему.
Отсюда:
let(:user_attributes) do
FactoryBot.attributes_for(:user)
end
let(:user) do
FactoryBot.create(:user, user_attributes)
end
# Triggers the create method in let(:user)
# Necessary to ensure the user exists in the database before testing sign in.
before { user }
let(:user_params) do
{ user: user_attributes }
end
it "redirects to the root path on successful sign in" do
post user_session_path(params: user_params)
expect(response).to redirect_to(root_path)
end
До этого:
let(:user) do
FactoryBot.create(:user)
end
let(:user_params) do
{ user: user.factory_attributes }
end
it "redirects to the root path on successful sign in" do
post user_session_path(params: user_params)
expect(response).to redirect_to(root_path)
end
Что значительно чище и менее запутанно, чем первое, особенно для начинающих разработчиков (можно было увидеть, что кто-то с небольшим опытом RSpec потратил довольно много времени, пытаясь выяснить, чтов аду строка "before {user}" делает)