Есть ли способ построить несколько моделей и установить связь между моделями и пользователем в RSpec?

У меня есть этот метод:

  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

Можно использовать такие фабрики, как factory_bot или fabrication.

Yakov 07.04.2022 15:08
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Шаг 1: Создание приложения Slack Чтобы создать Slackbot, вам необходимо создать приложение Slack. Войдите в свою учетную запись Slack и перейдите на...
0
1
30
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете построить эти объекты и связать их друг с другом с помощью любого метода Связь с активной записью.

Проще говоря, вы можете просто создавать транзакции и создавать с ними нового пользователя:


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) }

Другие вопросы по теме