2013-07-15 3 views
0

J'essaie de comparer deux objets pour voir s'ils sont identiques en utilisant hamcrest pour flex-unit, mais quand l'objet a des sous-objets, il lance juste une erreur:Quelle est la bonne façon de comparer les objets as3 en utilisant hamcrest

Error: Expected: (An array containing <[object Object]> 
but: an array containing <[object Object]> was <[object Object]> 

Je veux qu'il fasse un assertThat (..., hasProperties (...)); sur le sous-objet.

Existe-t-il un moyen d'obtenir cela ou devrais-je créer un matcher personnalisé?

EDIT

Un exemple de la structure d'objet je veux tester:

var expected:Object = { 
    number:1.3, 
    array:[{ 
     prop1:"val1", prop2:"val2" 
    }] 
    anObject:{ 
     propA:1, propB:2 
    }, 
} 

var objectUnderTest:Object = { 
    number:1.3, 
    array:[{ 
     prop1:"val1", prop2:"val2" 
    }] 
    anObject:{ 
     propA:1, propB:2 
    }, 
} 

assertThat("should be the same", objectUnderTest, hasProperties(expected)); 

depuis le prévu et objectUnderTest ont la même structure, le test doit passer, mais est de retour l'erreur: De plus, s'il existe un moyen de comparer deux chaînes JSON, cela fonctionnera également.

EDIT2

Ceci est ma version finale après Djib aide:

package com 
{ 
    public function assertEqualsObjects(message:String, object1:Object, object2:Object):Boolean 
    { 
     // we have to run it both ways (1-2, 2-1) 
     return (compare(object1, object2, message + ": object") && compare(object2, object1, message + ": extra")); 
    } 
} 

import org.flexunit.asserts.fail; 

function compare(object1:Object, object2:Object, parent:String):Boolean 
{ 
    var count:int = 0; 

    for (var s:String in object1) 
    { 
     count ++; 
     if (!object2.hasOwnProperty(s)) 
     { 
      fail(parent + "." + s + " expected: " + object1[s] + " but was: undefined"); 
      return false; 
     } 
     if (!compare(object1[s], object2[s], parent + "." + s)) 
     { 
      fail(parent + "." + s + " expected: " + object1[s] + " but was: " + object2[s]); 
      return false; 
     } 
    } 

    if (count == 0 && object1 != object2) // if object has no properties, compare their actual values 
    { 
     fail(parent + " expected: " + object1 + " but was: " + object2); 
     return false; 
    } 

    return true; 
} 
+0

Vous avez donc un tableau avec des objets et vous voulez vérifier quoi exactement? Que les objets dans le tableau ont certaines propriétés? Ou qu'ils sont d'un type spécifique? Ou que ce sont des instances spécifiques? – Creynders

+0

Ajout d'un exemple de code. J'espère que cela clarifier. – Marcotmp

+0

Il ne me dit toujours pas ce que vous voulez tester exactement. Voulez-vous vérifier que l'objet testé possède ces propriétés avec ces valeurs exactes, ou voulez-vous vérifier qu'il possède simplement les propriétés 'anObject' et 'array'? Je veux dire, jusqu'à quel point la vérification doit-elle aller loin? – Creynders

Répondre

0

J'ai mis ce code ensemble. La récursivité est la clé ^^

 // our two objects to compare ... 
     var obj1 = { 
      number:1.3, 
      array:[{prop1:"val1", prop2:"val2"}], 
      anObject:{propA:1, propB:2} 
     }; 

     var obj2 = { 
      number:1.3, 
      array:[{prop1:"val1", prop2:"val2"}], 
      anObject:{propA:1, propB:2} 
     }; 

     trace(isSame(obj1, obj2)); // -> true 


    function isSame(object1:Object, object2:Object):Boolean 
    { 
     // we have to run it both ways (1-2, 2-1) 
     return (compare(object1, object2) && compare(object2, object1)); 
    } 

    function compare(object1:Object, object2:Object):Boolean 
    { 
     var count:int = 0; 

     for (var s:String in object1) 
     { 
      count ++; 
      if (object2[s] == undefined) 
       return false; 
      if (!compare(object1[s], object2[s])) 
       return false; 
     } 

     if (count == 0 && object1 != object2) // if object has no properties, compare their actual values 
     return false; 

     return true; 
    } 
+0

Merci, ça marche. Maintenant, je vais ajouter quelques traces, donc je peux savoir pourquoi les objets ne sont pas les mêmes quand ils ne le sont pas. – Marcotmp

+0

Je suppose que la bonne façon d'utiliser hamcrest est des matchers personnalisés. – Marcotmp

Questions connexes