How to test a nested form with RSpec and FactoryGirl?

萝らか妹 提交于 2019-12-24 05:38:09

问题


In my Rails project I have a User that can have many Projects which in turn can have many Invoices. Each Invoice can have many nested Items.

class Invoice < ActiveRecord::Base

  attr_accessible :number, :date, :recipient, :project_id, :items_attributes

  belongs_to :project
  belongs_to :user

  has_many :items,    :dependent  => :destroy

  accepts_nested_attributes_for :items, :reject_if => :all_blank, :allow_destroy => true

  validates :project_id,  :presence => true

  def build_item(user)
    items.build(:price => default_item_price(user), :tax_rate => user.preference.tax_rate)
  end

  def set_number(user)
    self.number ||= (user.invoices.maximum(:number) || 0).succ  
  end

end

class InvoicesController < ApplicationController

  def new
    @invoice = current_user.invoices.build(:project_id => params[:project_id])
    @invoice.build_item(current_user)
    @invoice.set_number(current_user)
    @title = "New invoice"
  end

  def create
    @invoice = current_user.invoices.build(params[:invoice])    
    if @invoice.save
      flash[:success] = "Invoice created"
      redirect_to invoices_path
    else
      render :new
    end
  end

end

Now, I am trying to test the creation of invoices with RSpec and FactoryGirl and all tests pass except for the ones related to the POST create action, such as:

it "saves the new invoice in the database" do
  expect {
    post :create, invoice: attributes_for(:invoice, project_id: @project, items_attributes: [ attributes_for(:item) ])
  }.to change(Invoice, :count).by(1)
end

It keeps giving me this error:

Failure/Error: expect {
count should have been changed by 1, but was changed by 0

Can anybody tell me why this happens?

This is my factories.rb which I use to fabricate objects:

FactoryGirl.define do

  factory :invoice do
    number { Random.new.rand(0..1000000) }
    recipient { Faker::Name.name }
    date { Time.now.to_date }
    association :user
    association :project
  end

  factory :item do
    date { Time.now.to_date }
    description { Faker::Lorem.sentences(1) }
    price 50
    quantity 2
    tax_rate 10
  end

end

Can anybody help?

Thanks...

来源:https://stackoverflow.com/questions/15311734/how-to-test-a-nested-form-with-rspec-and-factorygirl

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!