У меня есть этот метод:
def current_budget(user)
total = 0
user.transactions.each do |t|
if t.income_or_expense
total += t.amount
else
total -= t.amount
end
end
total
end
Моя цель — написать тест RSpec для этого метода. Я хочу создать несколько транзакций и назначить их пользователю, чтобы при отправке этого пользователя этому методу метод возвращал сумму всех транзакций.
eg:
Transaction1: amount: 25, user_id: 1
Transaction2: amount: 30, user_id: 1
Transaction3: amount: 35, user_id: 1
user: user_id: 1
it { expect(current_budget(user)).to eq(90) }
Пользовательская модель
class User < ApplicationRecord
has_many :transactions
end
Модель сделки
class Transaction < ApplicationRecord
belongs_to :user
end
Вы можете построить эти объекты и связать их друг с другом с помощью любого метода Связь с активной записью.
Проще говоря, вы можете просто создавать транзакции и создавать с ними нового пользователя:
let(:user) { User.create(transactions: transactions) }
let(:transactions) do
[25, 30, 35].map do |amount|
Transaction.build(amount: amount)
end
end
it { expect(current_budget(user)).to eq(90) }
Но создание объектов один за другим может стать головной болью. Есть несколько драгоценных камней, которые обеспечивают отличный способ создания объектов, один из них — factory_bot.
Если вы определить фабрикуuser
и transaction
, вы можете просто назвать их так
let(:user) { create(:user, transactions: transactions) }
let(:transactions) do
[25, 30, 35].map do |amount|
build(:transaction, amount: amount)
end
end
it { expect(current_budget(user)).to eq(90) }
Можно использовать такие фабрики, как
factory_bot
илиfabrication
.