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
-~----------~----~----~----~------~----~------~--~---