0

次のメソッドは、ブラウザで正常に機能します。関連するすべてのトランザクションを取得し、それらの合計金額を合計します。

wallet.rb

has_many :transactions

# Sums the transaction amounts together
def total_spent
  transactions.map(&:amount).sum
end

factory.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

FactoryGirlassociationある種の機能として認識しません。transaction.associationしたがって、上記で行っているのは、に等しい属性を含むトランザクションを作成すること:walletです。

単純に次のように宣言した場合、トランザクションは、ファクトリを通じて作成されwalletた関連付けられたもので構築されます。WalletWallet

ただし、無限ループに陥りやすいため、ファクトリを定義して各方向に関連付けを構築しないように注意する必要があります。

さらに復習が必要な場合は、FactoryGirl のドキュメントを次に示します。

https://github.com/thoughtbot/factory_girl/wiki/使い方

あなたの問題に関しては、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 に答える