有没有办法在 RSpec 中构建多个模型并在模型和用户之间建立关系?

Is there a way to build multiple models and create relationship between the models and user in 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 测试。我想创建多个交易并将它们分配给一个用户,这样当我将该用户发送到此方法时,该方法 returns 所有交易的总和。

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

您可以构建这些对象并使用任何 Active Record association 方法将它们相互关联。

以一种简单的方式,您可以只构建交易并使用它创建一个新用户:


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

但是一个一个地创建对象可能会让人头疼。有一些 gem 提供了构建对象的好方法,其中之一是 factory_bot.

如果你 define a factory usertransaction,你可以这样称呼他们

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