Bug test di Rails

salve a tutti,
sentite, non riesco a capire i test automatizzati di Rails.

Secondo il libro, il ciclo di vita di un test prevede che per ogni
metodo ( che sarebbe in pratica un test da eseguire ) si verificano
sempre 3 eventi:

  1. la cancellazione di tutti i record della tabella in esame
  2. il caricamento di tutti i dati di test elencati nel file di fixture
    della tabella ( ad esempio products.yml )
  3. L’esecuzione del metodo setup() ( che altro non fa che caricarsi in
    una variabile il risultato della query di inizializzazione dei dati
    della tabella ).

Sempre secondo il libro, anche se un metodo di test aggiorna il database
di test, questo viene riportato al suo stato predefinito prima che inizi
il successivo metodo. Ciò significa quindi che i test da eseguire non
dipendono dai risultati di test già eseguiti.

Ho analizzato le query, ed ho notato che alla fine di ogni test esegue
un rollback.
Io ho installato nel mio sistema MySQL 4.1.20, ma questi rollback non
funzionano.
In pratica i test non funzionano, in quanto i primi metodi che esegue
influenzano eccome i successivi.

Qualcuno di voi ha già avuto esperienza di ciò, oppure pensate che i
test automatizzati non siano parte integrante dello sviluppo (e non
solo) di un progetto?

grazie mille

Ah dimenticavo, io le tabelle le ho create normalmente, come indicato
dal libro, quindi senza badare al tipo di tabella ( MyISAM oppure InnoDB
)

Mariano,

ci ho sbattuto la testa proprio un paio di giorni fa:(. Il problema e’
che
il libro non e’ aggiornato a Rails 1.0+
Una soluzione al problema e’ qui:
http://clarkware.com/cgi/blosxom/2005/10/24

-Piero

Secondo il libro, il ciclo di vita di un test prevede che per ogni

Piero C. ha scritto:

Sempre secondo il libro, anche se un metodo di test aggiorna il database

Qualcuno di voi ha già avuto esperienza di ciò, oppure pensate che i
test automatizzati non siano parte integrante dello sviluppo (e non
solo) di un progetto?

grazie mille

Ah dimenticavo, io le tabelle le ho create normalmente, come indicato
dal libro, quindi senza badare al tipo di tabella ( MyISAM oppure
InnoDB )

Gli dò subito un’occhiata… grazie per la risposta, almeno tu ti
interessi dei problemi di nuovi utenti novelli…
Cmq, volevo chiedere se le tue tabelle erano state create con MyISAM o
InnoDB, perchè in effetti i rollback nel mio mysql non funzionano…
anche facendoli da riga di comando…


//\ariano Di Felice
Java PHP Python Ruby programmer
with MySQL, PostgreSql, SQLite and Oracle support
Linux Platform Developer
[email protected]
Tel. 0735 703735
Cell +39 339 6407211

NO ai brevetti software! http://www.nosoftwarepatents.com

Nota di riservatezza:
Il presente messaggio, corredato dei relativi allegati contiene
informazioni da considerarsi strettamente riservate, ed è destinato
esclusivamente al destinatario sopra indicato, il quale è l’unico
autorizzato ad usarlo, copiarlo e, sotto la propria responsabilità,
diffonderlo. Chiunque ricevesse questo messaggio per errore o comunque
lo leggesse senza esserne legittimato è avvertito che trattenerlo,
copiarlo, divulgarlo, distribuirlo a persone diverse dal destinatario è
severamente proibito, ed è pregato di rinviarlo immediatamente al
mittente distruggendo l’originale.

Confidentiality Notice:
This message, together with its annexes, contains information to be
deemed strictly confidential and is destined only to the addressee(s)
identified above who only may use, copy and, under his/their
responsibility, further disseminate it. If anyone received this message
by mistake or reads it without entitlement is forewarned that keeping,
copying, disseminating or distributing this message to persons other
than the addressee(s) is strictly forbidden and is asked to transmit it
immediately to the sender and to erase the original message received.

Piero C. ha scritto:

Cmq, volevo chiedere se le tue tabelle erano state create con MyISAM o
InnoDB, perchè in effetti i rollback nel mio mysql non funzionano…
anche facendoli da riga di comando…

credo di aver usato MyISAM. Ma non sono sicurissimo.

-Piero
Cmq, penso di aver capito…
A me non funzionavano perchè avevo le tabelle MyISAM, e nel
test_helper.rb avevo impostato di default:
self.user_transactional_fictures = true
quindi lui tentava di fare i rollback, ma non riusciva essendo MyISAM,
quindi i primi test influenzavano i test seguenti.

ok Piero, ti ringrazio tanto. Non so se la pensate come me, ma i test
automatizzati sono una vera manna per il programmatore!!!


//\ariano Di Felice
Java PHP Python Ruby programmer
with MySQL, PostgreSql, SQLite and Oracle support
Linux Platform Developer
[email protected]
Tel. 0735 703735
Cell +39 339 6407211

NO ai brevetti software! http://www.nosoftwarepatents.com

Nota di riservatezza:
Il presente messaggio, corredato dei relativi allegati contiene
informazioni da considerarsi strettamente riservate, ed è destinato
esclusivamente al destinatario sopra indicato, il quale è l’unico
autorizzato ad usarlo, copiarlo e, sotto la propria responsabilità,
diffonderlo. Chiunque ricevesse questo messaggio per errore o comunque
lo leggesse senza esserne legittimato è avvertito che trattenerlo,
copiarlo, divulgarlo, distribuirlo a persone diverse dal destinatario è
severamente proibito, ed è pregato di rinviarlo immediatamente al
mittente distruggendo l’originale.

Confidentiality Notice:
This message, together with its annexes, contains information to be
deemed strictly confidential and is destined only to the addressee(s)
identified above who only may use, copy and, under his/their
responsibility, further disseminate it. If anyone received this message
by mistake or reads it without entitlement is forewarned that keeping,
copying, disseminating or distributing this message to persons other
than the addressee(s) is strictly forbidden and is asked to transmit it
immediately to the sender and to erase the original message received.

Cmq, volevo chiedere se le tue tabelle erano state create con MyISAM o
InnoDB, perchè in effetti i rollback nel mio mysql non funzionano…
anche facendoli da riga di comando…

credo di aver usato MyISAM. Ma non sono sicurissimo.

-Piero

Confermo! Parole sante…

Mariano Di Felice [email protected] ha scritto:
ok Piero, ti ringrazio tanto. Non so se la pensate come me, ma i test
automatizzati sono una vera manna per il programmatore!!!

Chiacchiera con i tuoi amici in tempo reale!
Yahoo Search - Ricerca nel Web | Motore di Ricerca

Sentite, altro problema che ho rilevato ora, sempre riguardo i test:

Per mantenere i test flessibili, se nel file di fixture ( ad esempio
products.yml ) ho

Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html

version_control_book:
id: 1
titolo: Pragmatic Version Control
descrizione: Come utilizzare il controllo di versione
image_url:
http://www.greenplanet.net/maxdev/upload/rte/vacca%20primo%20piano.jpg
prezzo: 29.95
date_available: 2005-01-26 00:00:00

automation_book:
id: 2
titolo: Pragmatic Project Automation
descrizione: Come automatizzare il vostro progetto
image_url:
http://www.greenplanet.net/maxdev/upload/rte/vacca%20primo%20piano.jpg
prezzo: 29.95
date_available: 2004-07-01 00:00:00

quando eseguo il test, Erb prende in considerazione questo file che i
test.
Ora, per mantenere flessibili i test, Rails ha pensato, secondo il
libro, di caricare in un array di tipo hash ciò che viene letto dal db,
come:

require File.dirname(FILE) + ‘/…/test_helper’

class ProductTest < Test::Unit::TestCase
fixtures :products
def setup
@product = Product.find(1)
end

def test_create
    assert_kind_of Product, @product
    vc_book = @products["version_control_book"]
    assert_equal vc_book["id"], @product.id
    assert_equal vc_book["titolo"], @product.titolo
    assert_equal vc_book["descrizione"], @product.descrizione
    assert_equal vc_book["prezzo"], @product.prezzo
    assert_equal vc_book["date_available"],

@product.date_available_before_type_cast
end
end

Il problema è che questo hash sembra essere vuoto, in quanto, quando
eseguo i test viene fuori:

  1. Error:
    test_create(ProductTest):
    NoMethodError: You have a nil object when you didn’t expect it!
    You might have expected an instance of Array.
    The error occured while evaluating nil.[]
    test/unit/product_test.rb:11:in `test_create’

Avete qualche idea del
perchè?
grazie

//\ariano Di Felice
Java PHP Python Ruby programmer
with MySQL, PostgreSql, SQLite and Oracle support
Linux Platform Developer
[email protected]
Tel. 0735 703735
Cell +39 339 6407211

NO ai brevetti software! http://www.nosoftwarepatents.com

Nota di riservatezza:
Il presente messaggio, corredato dei relativi allegati contiene
informazioni da considerarsi strettamente riservate, ed è destinato
esclusivamente al destinatario sopra indicato, il quale è l’unico
autorizzato ad usarlo, copiarlo e, sotto la propria responsabilità,
diffonderlo. Chiunque ricevesse questo messaggio per errore o comunque
lo leggesse senza esserne legittimato è avvertito che trattenerlo,
copiarlo, divulgarlo, distribuirlo a persone diverse dal destinatario è
severamente proibito, ed è pregato di rinviarlo immediatamente al
mittente distruggendo l’originale.

Confidentiality Notice:
This message, together with its annexes, contains information to be
deemed strictly confidential and is destined only to the addressee(s)
identified above who only may use, copy and, under his/their
responsibility, further disseminate it. If anyone received this message
by mistake or reads it without entitlement is forewarned that keeping,
copying, disseminating or distributing this message to persons other
than the addressee(s) is strictly forbidden and is asked to transmit it
immediately to the sender and to erase the original message received.

la soluzione e’ sempre nel link che ti ho dato, sotto la voce “On-Demand
Instantiated Fixtures”.
Il libro non e’ aggiornato alle ultime versione di rails. Quindi
l’esempio
in particolare che tu poni non funziona.

Questo e’ un esempio funzionante:
require File.dirname(FILE) + ‘/…/test_helper’

class ProductTest < Test::Unit::TestCase
fixtures :products

self.use_transactional_fixtures = false

def test_create
prod = products(:version_control_book)
assert_kind_of Product, prod
assert_equal 1, prod.id
end

def test_update
prod = products(:version_control_book)
assert_equal 29.95, prod.price
prod.price = 99.99
assert prod.save, prod.errors.full_messages.join("; ")
prod = products(:version_control_book, :refresh)
assert_equal 99.99, prod.price
end

Piero C. ha scritto:

la soluzione e’ sempre nel link che ti ho dato, sotto la voce “On-Demand
Instantiated Fixtures”.
Il libro non e’ aggiornato alle ultime versione di rails. Quindi
l’esempio
in particolare che tu poni non funziona.
Vacca boia, scusami, mi era sfuggito!
Thx :slight_smile:


//\ariano Di Felice
Java PHP Python Ruby programmer
with MySQL, PostgreSql, SQLite and Oracle support
Linux Platform Developer
[email protected]
Tel. 0735 703735
Cell +39 339 6407211

NO ai brevetti software! http://www.nosoftwarepatents.com

Nota di riservatezza:
Il presente messaggio, corredato dei relativi allegati contiene
informazioni da considerarsi strettamente riservate, ed è destinato
esclusivamente al destinatario sopra indicato, il quale è l’unico
autorizzato ad usarlo, copiarlo e, sotto la propria responsabilità,
diffonderlo. Chiunque ricevesse questo messaggio per errore o comunque
lo leggesse senza esserne legittimato è avvertito che trattenerlo,
copiarlo, divulgarlo, distribuirlo a persone diverse dal destinatario è
severamente proibito, ed è pregato di rinviarlo immediatamente al
mittente distruggendo l’originale.

Confidentiality Notice:
This message, together with its annexes, contains information to be
deemed strictly confidential and is destined only to the addressee(s)
identified above who only may use, copy and, under his/their
responsibility, further disseminate it. If anyone received this message
by mistake or reads it without entitlement is forewarned that keeping,
copying, disseminating or distributing this message to persons other
than the addressee(s) is strictly forbidden and is asked to transmit it
immediately to the sender and to erase the original message received.

Piero C. ha scritto:

la soluzione e’ sempre nel link che ti ho dato, sotto la voce “On-Demand
Instantiated Fixtures”.
Il libro non e’ aggiornato alle ultime versione di rails. Quindi
l’esempio
in particolare che tu poni non funziona.

Questa è la pena da patire nel comprare i libri: diventano subito
obsoleti, senza possibilità di aggiornamento…
A quando la prossima versione dell’e-book di “Sviluppare Applicazioni
Web con Rails”?


//\ariano Di Felice
Java PHP Python Ruby programmer
with MySQL, PostgreSql, SQLite and Oracle support
Linux Platform Developer
[email protected]
Tel. 0735 703735
Cell +39 339 6407211

NO ai brevetti software! http://www.nosoftwarepatents.com

Nota di riservatezza:
Il presente messaggio, corredato dei relativi allegati contiene
informazioni da considerarsi strettamente riservate, ed è destinato
esclusivamente al destinatario sopra indicato, il quale è l’unico
autorizzato ad usarlo, copiarlo e, sotto la propria responsabilità,
diffonderlo. Chiunque ricevesse questo messaggio per errore o comunque
lo leggesse senza esserne legittimato è avvertito che trattenerlo,
copiarlo, divulgarlo, distribuirlo a persone diverse dal destinatario è
severamente proibito, ed è pregato di rinviarlo immediatamente al
mittente distruggendo l’originale.

Confidentiality Notice:
This message, together with its annexes, contains information to be
deemed strictly confidential and is destined only to the addressee(s)
identified above who only may use, copy and, under his/their
responsibility, further disseminate it. If anyone received this message
by mistake or reads it without entitlement is forewarned that keeping,
copying, disseminating or distributing this message to persons other
than the addressee(s) is strictly forbidden and is asked to transmit it
immediately to the sender and to erase the original message received.