1

ユーザー rspec テストを構築しています。ユーザーに関連付けた請求書が多数あります。コンソールで user.invoices を実行すると、請求書のハッシュが表示されます。ただし、そのユーザーの請求書の数を取得するために user.invoices.count を実行すると、0 と表示されます。これが私のコードです。

  before(:each) do
    @user = FactoryGirl.build(:user)

    @invoice = FactoryGirl.build(:invoice)
    @invoice.issue_date = "2013-01-01"
    @user.invoices << @invoice

そこにデバッガーを入れると、count = 0 と表示されます。出力は次のとおりです。

(rdb:1) p user.invoices
[#<Invoice id: nil, user_id: 279, issue_date: "2013-01-01", due_date: nil, payment_term: "Net 15", discount: nil, created_at: nil, updated_at: nil, client_id: 140, client_invoice_id: 1, custom_message: nil, sent_to: nil, status: nil, public_id: "1234", grand_total: nil, user_name: nil, company_name: nil, custom_email_message: nil, address_line_one: nil, address_line_two: nil>, 
 #<Invoice id: nil, user_id: 281, issue_date: "2013-01-01", due_date: nil, payment_term: "Net 15", discount: nil, created_at: nil, updated_at: nil, client_id: 141, client_invoice_id: 1, custom_message: nil, sent_to: nil, status: nil, public_id: "1234", grand_total: nil, user_name: nil, company_name: nil, custom_email_message: nil, address_line_one: nil, address_line_two: nil>, 
 #<Invoice id: nil, user_id: 283, issue_date: "2012-01-01", due_date: nil, payment_term: "Net 15", discount: nil, created_at: nil, updated_at: nil, client_id: 142, client_invoice_id: 1, custom_message: nil, sent_to: nil, status: nil, public_id: "1234", grand_total: nil, user_name: nil, company_name: nil, custom_email_message: nil, address_line_one: nil, address_line_two: nil>, 
 #<Invoice id: nil, user_id: 285, issue_date: "2011-01-01", due_date: nil, payment_term: "Net 15", discount: nil, created_at: nil, updated_at: nil, client_id: 143, client_invoice_id: 1, custom_message: nil, sent_to: nil, status: nil, public_id: "1234", grand_total: nil, user_name: nil, company_name: nil, custom_email_message: nil, address_line_one: nil, address_line_two: nil>]
(rdb:1) p user.invoices.count
0

カウントが正しく機能しないのはなぜですか? これは私が合格しようとしているテストです:

 it "should return the correct count of all invoices in the specified year" do
   # there are two invoices in 2013
   user = @user
   user.count_of_invoices_by_year("2013", :total).should == 2
 end

count_of_invoices_by_year は .count を使用しており、正しく機能していません

4

1 に答える 1

2

これは、.count を送信すると、COUNT(*) を使用してデータベースにクエリを実行するためです。FactoryGirl.build を使用しているため、DB にレコードがないため、0 が返されます。

参照: http://rhnh.net/2007/09/26/counting-activerecord-associations-count-size-or-length これは、.size、.length、および .count の違いを説明しています。

編集:メソッドをテストする方法は次のとおりです(これによりレコードがDBに保存されますが、テスト後に破棄されます)

before(:each) do
  @user = FactoryGirl.create(:user)

  @invoice = FactoryGirl.create(:invoice)
  @invoice.issue_date = "2013-01-01"
  @invoice.save
  @user.invoices << @invoice
  @user.save
于 2013-04-14T03:02:53.300 に答える