Pour faire marcher ce test simple, j'ai principalement du lutter pour
trouver les deux astuces suivantes:
1. définir dans UserTest l'attribut useTable (sinon il cherche la
table users et pas user_tests)
2. ne pas utiliser setUp et TearDown mais preferer startCase()
endCase()
Bref merci bake pour ton travail a moitie fonctionnel!!
Ce qui donne :
// File fixture
class UserTestFixture extends CakeTestFixture {
var $name = 'UserTest';
var $import = 'array('table' => 'users', 'records' => true);
}
// File test
class UserTest extends User {
var $name = 'UserTest';
var $useDbConfig = 'test_suite';
var $useTable = 'user_tests';
}
class UserTestCase extends CakeTestCase {
var $TestObject = null;
var $fixtures = array( 'user_test' );
function startCase() {
$this->TestObject = new UserTest();
}
function endCase() {
unset($this->TestObject);
}
function testMe() {
$result = $this->TestObject->findAll();
debug($result);
$expected = 1;
$this->assertEqual($result, $expected);
$this->assertTrue($this->TestObject->save(
array(
'UserTest' => array(
'login'=> 'XXXXXXXXXXXXXXX',
'password' => 'CCCCCCCCCCCCCCC',
'created'=> '2008-01-27 03:56:13',
'modified'=> '2008-01-27 03:56:13'
)
)
));
}
}
On Feb 14, 4:11 pm, esion <[EMAIL PROTECTED]> wrote:
> Je me suis remis aux tests unitaires aujourd'hui je te mets le code
> d'un test de méthode élémentaire (Model::findAll() ) je l'espère de la
> manière la plus claire possible.
>
> ################################
> ##On considere la configuration suivante :
>
> CREATE TABLE `users` (
> `id` int(10) NOT NULL auto_increment,
> `username` varchar(40) NOT NULL,
> `password` varchar(40) NOT NULL,
> `email` varchar(255) NOT NULL,
> )
>
> Le model user
> //FILE : app/models/user.php
> class User extends AppModel {
> var $name = 'User';
>
> }
>
> ######################
> ## Création des données de tests : fixtures
>
> //FILE : app/tests/fixtures/user_fixtures.php
> class UserFixture extends CakeTestFixture {
> var $name = 'User';
> var $import = 'User'; //import du schema de la table
>
> var $records = array(
> array('id' => 1, 'username' => 'admin', 'password' =>
> '4308fb05a903a6c0add7534f3f73bee25ec16f3d' /*sha1+salt = admin*/,
> 'email' => '[EMAIL PROTECTED]'),
> array('id' => 2, 'username' => 'esion', 'password' => 'esion',
> 'email' => '[EMAIL PROTECTED]'),
> array('id' => 4, 'username' => 'user', 'password' => 'user',
> 'email'
> => '[EMAIL PROTECTED]'),
> );
>
> }
>
> ######################
> ## Test du Model
>
> //FILE : app/tests/cases/models/user.test.php
> App::import('Model', 'User'); //Import du model
>
> class UserTest extends User { //surcharge du model
>
> var $name = 'User'; //Définition des objets avec le nom d'origine
> var $useDbConfig = 'test'; //Spécification de la base de données à
> utiliser
>
> }
>
> class UserTestCase extends CakeTestCase {
> var $fixtures = array('user'); //Appel des enregistrements : la table
> de test possède maintenant des enregistrements.
>
> function testFindAll() { //test d'une méthode par défaut du model
> $this->TestObject =& new UserTest(); //Chargement du model
> $this->TestObject->recursive = 0;
> $result = $this->TestObject->findAll(array(), array('id',
> 'username')); //lancement de la méthode
> //debug($result);
> $expected = array(
> array('User' => array('id' =>
> 1, 'username' => 'admin')),
> array('User' => array('id' =>
> 2, 'username' => 'esion')),
> array('User' => array('id' =>
> 4, 'username' => 'user'))
> );
> $this->assertEqual($result, $expected); //vérification des
> résultats
> }
>
> }
>
> #####################
> ## Déroulement du test :
>
> Lorsque user.test.php est lancé
> 1- la classe UserTestCase est chargée
> 2- fixtures est spécifié : la table `test_suite_users` est créée dans
> la base de test (automagiquement, enfin je pense)
> 3- la méthode testFindAll() est lancée
> 4- L'objet testObject est créé
> 5- la méthode findAll de testObject est lancé et retourne les
> enregistrements (fixtures)
> 6- assert test le résultat
> 7- l'objet est détruit ainsi que la table avec les enregistrements
> (automagiquements).
>
> ##################
> ## Note :
> - Apparement les méthodes setUp et TearDown générés par bake pose des
> problèmes pour l'appel de la classe UserTest
> - Je me trompe peut être (surement) sur le déroulement du test.
>
> ## hf
>
> On 14 fév, 14:35, avairet <[EMAIL PROTECTED]> wrote:
>
> > Merci à tous les deux pour vos réponses, mais cela ne correspond pas à
> > mes questions...
> > C'est sans doute que je me suis mal exprimé.
>
> > @euphrate : le tuto dans la Bakery date un peu et n'aborde pas les
> > tests unitaires générés par le script Bake
>
> > @esion : oui j'avais lu ta discussion, très intéressante, mais
> > malheuresuement restée sans véritable émulation et rebonds
>
> > En fait le testing et la génération de code sont les grands absents de
> > la doc pour le moment, mais vu que les tests était l'un des thèmes
> > importants de la Cake fest et qu'ils semblent l'un des chantiers les
> > plus actifs au sein de la core team, je pense que nous aurons
> > prochainement des infos plus précises...
>
> > Je reviens à mes questions quand même :
>
> > - si je souhaite faire générer des tests unitaires, il semble
> > obligatoire d'avoir une base de test et de lui insérer les mêmes
> > tables que dans la base "default", sinon deux problèmes surviennent :
> > 1) au lancement du test unitaire, il y a un gros warning qui me dit
> > que la table "xyz_test" n'existe pas 2) au moment où l'on lance le
> > script Bake et que l'on dit vouloir travailler avec la base de test,
> > il est impossible de générer quoi que ce soit si la base est vide !
>
> > >>>> il est donc obligatoire d'avoir une base test et de la peupler avec
> > >>>> des tables pour profiter à la fois des tests unitaires et de leur
> > >>>> génération par le script Bake ?!
>
> > - si je choisis ma base "test" dans le script Bake, que je génère tout
> > le code de base d'une application (modèles et contrôleurs), Cake
> > écrit : $useDbConfig = 'test' dans l'entête des classes, donc ma
> > question : doit-on repasser partout pour remplacer "test" par
> > "default" lorsque la phase de test est terminée ? ou bien doit-on
> > refaire toute la génération de code en indiquant cette fois au script
> > Bake que l'on utilise la base "default" ?
>
> > J'espère que cela sera plus clair...
>
> > @ +
>
> > Avairet
>
> > On 13 fév, 23:18, esion <[EMAIL PROTECTED]> wrote:
>
> > > J'avais lancé ce sujet
> > > :http://groups.google.fr/group/cakephp-fr/browse_thread/thread/ea2641e...
>
> > > J'ai quelque chose de plus ou moins fonctionnel et je dois dire que
> > > c'est loin d'être évident. Et le tuto du bakery ne parle que du test
> > > de models et pas des controllers.
>
> > > 1) Apparement peu importe la base de données que tu choisis, lorsqu'un
> > > test est lancé avec des fixtures celui-ci recreer les tables avec le
> > > prefixe "test_suite_ ".
> > > Les données de la base (default ou test) vont servir aux tests
> > > seulement si les fixtures ne sont pas spécifiés.
>
> > > On 13 fév, 19:16, euphrate_ylb <[EMAIL PROTECTED]> wrote:
>
> > > > Dans la bakery je trouve que cet article relativement complet:
>
> > > >http://bakery.cakephp.org/articles/view/testing-models-with-cakephp-1...
>
> > > > Pour le moment nous n'utilisons pas vraiment les test unitaires mais d
> > > > apres ce que je sais :
>
> > > > 1. Tu peux dire grace a l'attribut import de a tes fixtures si tu
> > > > souhaites utiliser la structure de la base devfault voire meme les
> > > > data.
> > > > ex: var $import = array('model' => 'Article', 'records' => true);
>
> > > > 2. ...
>
> > > > 3. Pb de prefix dans la connexion?
>
> > > > 4. Lorsque tu lances les test unitaire, la connexion 'test' est
> > > > utilisée par defaut (si elle existe) sans rien changer dans tes
> > > > modeles
>
> > > > En esperant que quelqu un te reponde plus précisement.
>
> > > > euphrate_ylb
>
> > > > On Feb 13, 3:30 pm, avairet <[EMAIL PROTECTED]> wrote:
>
> > > > > Bonjour à tous,
>
> > > > > Quand on utilise le script Bake en ligne de commande, pour générer le
> > > > > code de base de notre application, on a la possibilité de créer
> > > > > également les tests unitaires. Mais j'ai l'impression que tout ne
> > > > > marche pas comme prévu...
>
> > > > > 1) Avant toute chose, doit on importer notre schéma SQL dans les deux
> > > > > bases : default et test ?
>
> > > > > 2) On doit choisir une Database config : default ou test, mais le
> > > > > comportement et la génération des fichiers ne semble pas identique
> > > > > selon qu'on choisit l'un ou l'autre...
>
> > > > > 3) Après la création de mon modèle, du fichier de test et de la
> > > > > fixture correspondante, si je lance mon test, j'ai de gros Warnings
> > > > > qui me disent, entre autres, que la table test_mymodel n'existe pas
>
> > > > > 4) Si je veux générer mon code et mes tests unitaires, je choisis donc
> > > > > "test" comme Database config, mais alors, dois-je ensuite refaire tout
> > > > > le processus de génération en choisissant "default" ? Parce que le
> > > > > fait de lui indiquer "test" entraîne l'insertion de "$useDbConfig =
> > > > > 'test';" dans tous mes modèles !
>
> > > > > Merci par avance de vos commentaires et suggestions, le script Bake et
> > > > > les Tests unitaires étant pour l'instant assez mal documentés sur les
> > > > > sites officiels ou les blogs des Bakers. J'espère que cela va changer
> > > > > après la CakeFest et le tout neuf CookBook...
>
> > > > > Avairet
--~--~---------~--~----~------------~-------~--~----~
Groupe "Cakephp-fr".
Adresse : [email protected]
Pour résilier : [EMAIL PROTECTED]
Pour les options : http://groups.google.com/group/cakephp-fr?hl=fr
-~----------~----~----~----~------~----~------~--~---