IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Salesforce.com Discussion :

Modifier la valeur de la donnée d'une classe depuis sa référence CaseTest.clientRegion__r.chekboxtest__c


Sujet :

Salesforce.com

  1. #1
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2009
    Messages
    177
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2009
    Messages : 177
    Points : 86
    Points
    86
    Par défaut Modifier la valeur de la donnée d'une classe depuis sa référence CaseTest.clientRegion__r.chekboxtest__c
    Bonjour,

    Je suis actuellement entrain de faire une classe de test.
    Cependant j'ai une règle de validation qui me bloque.
    Cette règle bloque la modification d'un objet case si dans le compte associé à la référence clientRegion__c (reference compte/account) le chekboxtest__c n'est pas validé.

    Dans ma classe de test je fais donc cela:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    //...mon jeu de donnée est fait
    
    
    //liste modifier
    List<Case> CaseListModifier= new List<Case>();
    
    //requête
    List<Case> lstCase = [Select c.Status, c.Id, c.CaseNumber, c.Commission_calculee__c, c.clientRegion__r.chekboxtest__c 
    From Case c
    WHERE transmis_a_comptabilite__c = true ];
    
    
    if(!lstCase.isEmpty() && lstCase.size() > 0 ){
    	System.debug('>>> si la requete retourne des cases');
    
          //je recupere bien les info
          for(Case CaseTest: lstCase){
    
    
    	 System.debug('>>> dfgdfgdfgf' + CaseTest);
    
    	CaseTest.clientRegion__r.chekboxtest__c = true;
    
    
    	System.debug('>>> lstCase' + CaseTest);
    
    	CaseListModifier.add(CaseTest); 	
    
        }
    
    update (CaseListPreFacture);
    //et là la règle de validation se déclenche. Dans le journal de debug:
    // chekboxtest__c = false
    La règle de validation (se déclenche si le test=true):
    clientRegion__r.chekboxtest__c = false
    &&
    transmis_a_comptabilite__c = true

    Savez-vous pourquoi?
    Peut être n'ai je pas le droit de modifier un objet depuis un autre objet?

    Merci beaucoup pour votre aide précieuse,

  2. #2
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2011
    Messages
    239
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Novembre 2011
    Messages : 239
    Points : 424
    Points
    424
    Par défaut
    Citation Envoyé par max33370 Voir le message

    Savez-vous pourquoi?
    Peut être n'ai je pas le droit de modifier un objet depuis un autre objet?
    bonjour,

    Pour moi l'update du case ne va pas modifier les champs de clientRegion
    ou alors faire un update CaseTest.clientRegion__r (mais je doute que cela fonctionne)

    il faut mieux recuperer les clientRegion concernées par tes cases, update leur valeurs de chekboxtest__c et ensuite travailler sur tes cases

    maintenant d'une maniere plus generale, je trouve ce code bien compliqué pour une classe de test et d'ailleurs sauf impossibilité j'eviterais de travailler directement sur les données dans les tests (meme si cela ne les impactent pas), et d'ailleurs si tu travailles sur une sandbox, tu n'as pas de données ....
    Bref, j'ai toujours le reflexe de creer les données dont j'ai besoin directement dans la classe de test

    Par exemple dans ton cas,
    je crée le clientRegion
    clientRegion cr = new clientRegion()
    cr.chekboxtest__c = true;
    insert cr;

    je cree mon case
    case c = new case();
    c.clientRegionId = cr.Id;
    c.transmis_a_comptabilite__c = true;
    etc etc etc
    insert c;

    je fais ensuite mes tests (si tu as plusieurs tests, tu peux regrouper les inserts dans une method d'initialisation des données

    En esperant avoir aidé ...
    Vincent

  3. #3
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2009
    Messages
    177
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2009
    Messages : 177
    Points : 86
    Points
    86
    Par défaut
    Bonjour v.charlet et merci pour ta réponse.
    il faut mieux recuperer les clientRegion concernées par tes cases, update leur valeurs de chekboxtest__c et ensuite travailler sur tes cases
    Oui en effet on est obligé de récupérer la valeur id du client, puis faire une requête pour récupérer l'objet client et ainsi faire la modif.

    et d'ailleurs si tu travailles sur une sandbox, tu n'as pas de données ....
    Heu je dois mal comprendre. Sur ma sandbox de dev (type Developer), j'ai des données enregistrées (des comptes, des clients, des cases)... Ca me permet de faire mes tests! Pourquoi dis tu cela?

    je trouve ce code bien compliqué pour une classe de test et d'ailleurs sauf impossibilité j'eviterais de travailler directement sur les données dans les tests
    J'ai créé une classe factory qui me permet de créer un environnement. Un client, un compte, relié à un case...
    En quoi ce code est il compliqué? malgré qu'il soit un peu dégueu pour le moment ^^

    Merci

  4. #4
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2011
    Messages
    239
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Novembre 2011
    Messages : 239
    Points : 424
    Points
    424
    Par défaut
    Citation Envoyé par max33370 Voir le message
    Heu je dois mal comprendre. Sur ma sandbox de dev (type Developer), j'ai des données enregistrées (des comptes, des clients, des cases)... Ca me permet de faire mes tests! Pourquoi dis tu cela?
    à la création d'une Sandbox Dev au départ, il n'y a aucune données (les données de production ne sont pas remontées), ensuite effectivement tu peux en ajouter ...

    Le code me parait compliqué parce que je pense raisonner differement lorsque j'écris mon test
    je crée les données dont j'ai bsoin et qui correspondent exactement à ce que je dois tester et donc je n'ai pas à les controler ou les selectionner (par des IF (...) ou des SELECT ... )

    après est ce que j'ai mieux ou pas j'en sais rien !

    Par exemple, ma classe de test d'un trigger de mise à jour d'un champ, j'ai une valeur dans un champ texte et je recherche cette cle pour mettre à jour un champ lookup quand c'est possible)
    en créant mes données, je n'ai pas à me poser de question si mes données de type Gare__c sont correctes ou pas, existe ou pas, mon test est completement independant de l'etat des données de ma sandbox, je trouve ça plus stable !

    imagine plus tard, je travaille sur un autre developpement, je crée une nouvelles Sandbox, mon test est viable meme s'il n'y a aucune Gare__c sur mon environnement, je n'ai pas à charger de données


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    trigger AG_SignalementTrigger on Case (before insert, before update) {
    
        Map<String, Gare__c> gares = new Map<String, Gare__c>();
    
        for(Gare__c gare: [SELECT Id, Name, gareextID__c FROM Gare__c])
            gares.put(gare.gareextID__c, gare);
    
        for(Case sig: Trigger.new) {
    
            Gare__c gareNom = gares.get(sig.Nom_gareWeb__c);
            if (gareNom != Null) {
                sig.Nom_gare__c = gareNom.Id;
                sig.Nom_gareWeb__c = '';
            }
            
        }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    @isTest
    private class AG_SignalementTrigger_TEST {
    
        static testMethod void testSignalementGareExist() {
            
            Gare__c aaa = new Gare__c(Name = 'aaa', gareextID__c = 'aaa');
            insert aaa;
    
            Case sig = new Case();
            sig.Nom_gareWeb__c = 'aaa';
            insert sig;
            
            sig = [SELECT Id, Nom_gare__c, Nom_gareWeb__c FROM Case WHERE Id =:sig.Id];
            
            System.assertEquals(sig.Nom_gare__c, aaa.Id);
            System.assertEquals(sig.Nom_gareWeb__c, Null);
        }
    
        static testMethod void testSignalementGareNotExist() {
            
            Case sig = new Case();
            sig.Nom_gareWeb__c = 'ddd';
            insert sig;
            
            sig = [SELECT Id, Nom_gare__c, Nom_gareWeb__c FROM Case WHERE Id =:sig.Id];
            
            System.assertEquals(sig.Nom_gare__c, Null);
            System.assertEquals(sig.Nom_gareWeb__c, 'ddd');
        }

  5. #5
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2009
    Messages
    177
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2009
    Messages : 177
    Points : 86
    Points
    86
    Par défaut
    Par exemple, ma classe de test d'un trigger de mise à jour d'un champ, j'ai une valeur dans un champ texte et je recherche cette cle pour mettre à jour un champ lookup quand c'est possible)
    en créant mes données, je n'ai pas à me poser de question si mes données de type Gare__c sont correctes ou pas, existe ou pas, mon test est completement independant de l'etat des données de ma sandbox, je trouve ça plus stable !

    imagine plus tard, je travaille sur un autre developpement, je crée une nouvelles Sandbox, mon test est viable meme s'il n'y a aucune Gare__c sur mon environnement, je n'ai pas à charger de données
    Mais comme je te l'ai dit, je créé déjà mes données dans une factory. J'appelle cette factory en début de code test, ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    List<Sobject> lstObj = SmartFactory.createFullCaseEnv('0');
    Cela va me créér un environnement pour la création de mes case (compte, partenaire, Contact, User, Entitlement...), bref tout ce qu'il me faut pour coller au plus à la réalité. Car lorsque je créé un case de nombreux objet sont aussi créés...

    Puis je créé un Case avec en paramètre les objets qui sont affecté à cet objet, le compte, le user...:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Case c = SmartFactory.CreateCase(System.label.Case_Recordtype_PhysiqueDossierLogic_Id, listEmp[countListEmp].Id, lstObj[7].Id, lstObj[0].Id);
    Encore une fois. Ces données n'existent que dans mes cas de test et non dans la sandbox!
    Mais de cette façon, ma factory prend en compte mes règles de validation...

    Imaginons que comme moi tu as de nombreuses règles de validation qui test (lors de la création ou la modification d'un case) si tu as bien inséré des données, et bien ta façon de faire serait bloqué par tes règles de validation. Si tu as 50 données/objets à insérer à chaque fois, alors au lieu de créer à chaque fois :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Gare__c aaa = new Gare__c(Name = 'aaa', gareextID1__c = 'aaa', gareextID2__c = 'aaa' gareextID3__c = 'aaa', gareextID4__c = 'aaa' ,gareextID5__c = 'aaa' ,gareextID6__c = 'aaa',gareextID7__c = 'aaa' .............................);
            insert aaa;
    Il vaut mieux créer une factory.
    Après peut être que toi tu passes outre les règles de validation...? Qu'en penses-tu?

Discussions similaires

  1. Réponses: 1
    Dernier message: 11/12/2009, 20h28
  2. Réponses: 0
    Dernier message: 02/12/2008, 09h34
  3. Réponses: 2
    Dernier message: 29/06/2008, 19h16
  4. Modifier les valeurs de certains champs d'une table
    Par Xorbane dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 22/10/2007, 22h10
  5. Réponses: 4
    Dernier message: 07/08/2006, 16h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo