有没有办法在 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 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) }
我有这个方法:
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 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) }