[Rails] Test...questi sconosciuti :-(

Ciao a tutti.
Stavo provando a fare alcuni piccoli test su un piccolo esercizio che
sto usando per imparare il linguaggio.
Volevo verificare l’univocità di un particolare attributo che, nel mio
modello, ho dichiarato come:

validates_uniqueness_of :Prodotto

Per fare questo ho creato una piccolo file (prodottis.yml) nella
cartella fixtures contenente il seguente codice:

ruby_book:
Prodotto: speriamo
Descrizione: un libro di fave
URLimmagine: immagine.jpg
prezzo: 1234

prova:
Prodotto: speriamo
Descrizione: un libro di fave
URLimmagine: immagine.jpg
prezzo: 1234

dopodichè ho editato il file di test (prodotti_test.rb) in questo modo:

fixtures :prodottis

test “unique title” do
product = Prodotti.new(:Prodotto => prodottis(:ruby_book).Prodotto,
:Descrizione => “yyy”, :URLimmagine => “zzz.jpg”)
assert !product.save
assert_equal “has already been taken”, product.errors.on(:Prodotto)
prod = Prodotti.new(:Prodotto => prodottis(:prova).Prodotto,
:Descrizione => “yyy”, :URLimmagine => “zzz.jpg”)
assert !prod.save
assert_equal “has already been taken”, prod.errors.on(:Prodotto)
end

La cosa strana é che non viene generato alcun “Failure” come invece mi
aspetterei.
Nel db test, a ogni esecuzione del test, vengono semplicemente crati due
prodotti (quindi ho due righe) con lo stesso campo “Prodotto” nel mio
caso “speriamo”.
Dove sto sbagliando? perchè non ottengo 2 failures come mi aspetterei?

Un grazie anticipato a tutte le persone che mi daranno un aiuto :wink:

Hai verificato anche da console? E’ il test più veloce.

Permettimi un consiglio che non tocca il quesito: il model dovrebbe
essere singolare e se vuoi usare i nomi in italiano puoi sempre
modificare il file inflections per evitare quegli obrobri di plurali
anglosassioni su parole italiane
config\initializers\inflections.rb

Ciao

Marco M. wrote:

Hai verificato anche da console? E’ il test più veloce.

Permettimi un consiglio che non tocca il quesito: il model dovrebbe
essere singolare e se vuoi usare i nomi in italiano puoi sempre
modificare il file inflections per evitare quegli obrobri di plurali
anglosassioni su parole italiane
config\initializers\inflections.rb

Ciao

Lo so…solo che era il mio primo model e non sapevo della storia dei
plurali :wink:
Puoi aiutarmi sul test?

Grazie

pezzuya … wrote:

Puoi aiutarmi sul test?

Grazie

Purtroppo non sono molto esperto di test, io farei così per capire dove
rivolgere l’attenzione:

ruby script\console
Prodotti.new(:Prodotto => “pippo”, :Descrizione => “yyy”, :URLimmagine
=> “zzz.jpg”).save
Prodotti.new(:Prodotto => “pippo”, :Descrizione => “yyy”, :URLimmagine
=> “zzz.jpg”).save

Dovresti aspettarti un true end un false. Puoi controllare il messaggio
di errore:

p=Prodotti.new(:Prodotto => “pippo”, :Descrizione => “yyy”, :URLimmagine
=> “zzz.jpg”)
p.save
p.errors

Se funziona il vincolo dell’univocità allora ti concentri sul test
(probabilmente non fa un inserimento?) altrimenti controlla il model

Ho modificato il mio codice nel seguente modo:

fixtures :prodottis

test “unique title” do
product = Prodotti.new(:Prodotto => prodottis(:ruby_book).Prodotto,
:Descrizione => “yyy”, :URLimmagine => “zzz.jpg”)
assert product.save
assert_equal “has already been taken”, product.errors.on(:Prodotto)
prod = Prodotti.new(:Prodotto => prodottis(:prova).Prodotto,
:Descrizione => “yyy”, :URLimmagine => “zzz.jpg”)
assert prod.save
assert_equal “has already been taken”, prod.errors.on(:Prodotto)
end

Ho praticamente eliminato il “!” prima delle istruzioni “product.save” e
“prod.save” a questo punto eseguendo il test viene effettivamente
generata una failure sull’istruzione “product.save” (che ritorna false)
la cosa strana però é che la failure continua a essere generata anche
quando nel modello commento:

#validates_uniqueness_of :Prodotto

quindi le cose non tornano di nuovo :frowning:
Inoltre controllando le date di creazione delle entry sembra che,
nonostante la failure, all’interno del DB test vengano comunque create
due nuove entry con lo stesso campo “Prodotto”.

E’ ufficiale non ci sto capendo niente.

Qualcuno sà come illuminarmi?

pezzuya … wrote:

Qualcuno sà come illuminarmi?

Il product.save dovrebbe ritornare true, probabilmente c’è qualche altro
errore e questo il motivo per cui è ininfluente commentare il vincolo
nel model. Controlla il messaggio di errore in product.errors

Marco M. wrote:

pezzuya … wrote:

Qualcuno sà come illuminarmi?

Il product.save dovrebbe ritornare true, probabilmente c’è qualche altro
errore e questo il motivo per cui è ininfluente commentare il vincolo
nel model. Controlla il messaggio di errore in product.errors

In teoria product.save é giusto che ritorni false…almeno credo…
prova a salvare i dati ma trovando che “Prodotto” non é univoco non
riesce a salvare e restituisce false.
o no?

La prima volta non dovrebbe esserci quel prodotto quindi dovrebbe
inserirlo, la seconda volta invece dovrebbe darti false …altrimenti
non ho capito il senso del tuo test

Purtroppo non sono molto esperto di test, io farei così per capire dove
rivolgere l’attenzione:

ruby script\console
Prodotti.new(:Prodotto => “pippo”, :Descrizione => “yyy”, :URLimmagine
=> “zzz.jpg”).save
Prodotti.new(:Prodotto => “pippo”, :Descrizione => “yyy”, :URLimmagine
=> “zzz.jpg”).save

Dovresti aspettarti un true end un false. Puoi controllare il messaggio
di errore:

p=Prodotti.new(:Prodotto => “pippo”, :Descrizione => “yyy”, :URLimmagine
=> “zzz.jpg”)
p.save
p.errors

Se funziona il vincolo dell’univocità allora ti concentri sul test
(probabilmente non fa un inserimento?) altrimenti controlla il model

In effetti fà tutto quello che hai detto…
quando eseguo “p.errors” l’errore restituito é

ActiveRecord::Error Prodotto has already been taken

l’errore é nel test.

Dovrei fare un test per capire cosa non và nel test :slight_smile:

:frowning:

Marco M. wrote:

La prima volta non dovrebbe esserci quel prodotto quindi dovrebbe
inserirlo, la seconda volta invece dovrebbe darti false …altrimenti
non ho capito il senso del tuo test

sì giusto.
Ma se nel db di test esiste già una entry con quel Prodotto dovrebbe
fallire anche il primo.
Qui la cosa strana é che effettivamente fallisce ma nel db vengono
comunque create due nuove entry.