Comment créer des objets de test avec des attributs imbriqués avec FactoryGirl dans Ruby on Rails?
J'ai un Invoice
modèle qui peut contenir un certain nombre de Items
ainsi:
class Invoice < ActiveRecord::Base
attr_accessible :number, :date, :recipient, :items_attributes
belongs_to :user
has_many :items
accepts_nested_attributes_for :items, :reject_if => :all_blank, :allow_destroy => true
end
Je suis en train de tester cette aide RSpec:
describe InvoicesController do
describe 'user access' do
before :each do
@user = FactoryGirl.create(:user)
@invoice = @user.invoices.create(FactoryGirl.attributes_for(:invoice))
sign_in(@user)
end
it "renders the :show view" do
get :show
expect(response).to render_template :show
end
end
end
Malheureusement, ce test (et tous les autres) échoue avec ce message d'erreur à partir de RSpec:
Failure/Error: @invoice = @user.invoices.create(FactoryGirl.attributes_for(:invoice))
ActiveModel::MassAssignmentSecurity::Error:
Can't mass-assign protected attributes: items
Comment puis-je créer une facture avec des éléments qui vont passer mes tests?
Je suis en utilisant FactoryGirl pour fabriquer des objets comme ceci:
factory :invoice do
number { Random.new.rand(0..1000000) }
recipient { Faker::Name.name }
date { Time.now.to_date }
association :user
items { |i| [i.association(:item)] }
end
factory :item do
date { Time.now.to_date }
description { Faker::Lorem.sentences(1) }
price 50
quantity 2
end
source d'informationauteur Tintin81 | 2013-03-04
Vous devez vous connecter pour publier un commentaire.
C'est une pile de réponse j'ai un signet lorsque j'essayais de le comprendre:
usine-fille-nested-usine
Edit: Désolé, vient de réaliser que la réponse était de la pure FactoryGirl et pas de rspec.
Avez-vous vérifié https://github.com/thoughtbot/factory_girl/blob/master/GETTING_STARTED.md#associations?
Il y a une partie sur has_many-associations. Essentiellement, ce qu'il dit est de prolonger votre facture-usine avec un qui ajoute certains éléments après avoir créé la facture.