Sto provando a testare un ambito che ho basato su una catena di altri ambiti. ("public_stream" di seguito).Stubbing Chained Queries in Rails 3 e Rspec
scope :public, where("entries.privacy = 'public'")
scope :completed, where("entries.observation <> '' AND entries.application <> ''")
scope :without_user, lambda { |user| where("entries.user_id <> ?", user.id) }
scope :public_stream, lambda { |user| public.completed.without_user(user).limit(15) }
Utilizzando un test come questo:
it "should use the public, without_user, completed, and limit scopes" do
@chain = mock(ActiveRecord::Relation)
Entry.should_receive(:public).and_return(@chain)
@chain.should_receive(:without_user).with(@user).and_return(@chain)
@chain.should_receive(:completed).and_return(@chain)
@chain.should_receive(:limit).with(15).and_return(Factory(:entry))
Entry.public_stream(@user)
end
Tuttavia, continuo a ricevere questo errore:
Failure/Error: Entry.public_stream(@user)
undefined method `includes_values' for #<Entry:0xd7b7c0>
Sembra includes_values è una variabile del ActiveRecord istanza :: oggetto Relation , ma quando provo a fermarlo, continuo a ricevere lo stesso errore. Mi stavo chiedendo se qualcuno avesse esperienza con le nuove query incatenate di Rails 3? Riesco a trovare un sacco di discussioni su hash find 2.x, ma nulla su come testare ciò che è attuale.
Per curiosità, funziona se non si utilizza 'public'?Esiste un conflitto tra il nome dell'ambito e la parola chiave 'public' Ruby. Non sono sicuro che questo sia il problema, ma sarebbe interessante sapere se nella catena questo test fallisce. –
Gli ambiti sono direttamente correlati al database, quindi non è necessario testarli separatamente. Basta creare alcuni record reali e testare cosa restituisce la query. – RocketR