0

以下方法在浏览器中运行良好。它所做的所有事情都需要所有关联的交易,并将它们的总金额加在一起。

钱包.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 是正确的数量。同样,这在浏览器中运行良好!

运行 Rails 3.2,FactoryGirl 4.2

4

1 回答 1

1

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

我希望这会有所帮助。

于 2013-01-27T01:36:07.950 回答