以下方法在浏览器中工作正常。它所做的只是将所有关联的交易,并将它们的总金额相加。
钱包.rb
has_many :transactions
# Sums the transaction amounts together
def total_spent
transactions.map(&:amount).sum
end
工厂.rb
FactoryGirl.define do
# Create a wallet
factory :wallet do
title 'My wallet'
end
# Create a single transaction
factory :transaction do
association :wallet
title 'My transaction'
amount 15
end
end
wallet_spec.rb
it "should get the sum of the transactions" do
transaction = FactoryGirl.create(:transaction)
wallet = transaction.wallet
wallet.total_spent.should eq 15
end
测试一直失败。我收到 0,但预计 15 是正确的金额。同样,这在浏览器中工作正常!
跑轨 3.2, 工厂女孩 4.2
FactoryGirl
不association
识别为某种函数。因此,您在上面所做的是创建一个包含属性 transaction.association
等于 :wallet
的事务。
如果您只是将其声明为 wallet
那么您的事务将使用通过Wallet
工厂创建的关联Wallet
构建。
不过,在定义工厂时需要小心,不要在每个方向上建立关联,因为您很容易陷入无限循环。
以下是有关FactoryGirl的文档,如果您需要更多复习:
https://github.com/thoughtbot/factory_girl/wiki/Usage
至于您的问题,我建议不要依赖FactoryGirl中定义的值来进行测试。工厂的存在是为了更快地定义默认值以通过某些验证检查。不过,您不应该真正基于这些默认值进行测试。我会推荐类似以下测试的东西:
it "should get the sum of the transactions" do
wallet = FactoryGirl.create(:wallet)
wallet.transactions << FactoryGirl.create(:transaction, amount: 15)
wallet.transactions << FactoryGirl.create(:transaction, amount: 10)
wallet.total_spent.should eq 25
end
我希望这有所帮助。