2017-09-18 9 views
0

J'essaie de comparer 2 objets, d'abord s'ils ont les mêmes clés, puis si leurs valeurs de clé sont égales, alors les tests de assertEquals échouent toujours. Je pense que c'est parce que les deux objets sont à l'intérieur d'un tableau, donc c'est en train de comparer un tableau d'objets par rapport à un autre tableau d'objets. De plus, mon objet réel est créé à partir d'une fonction alors que l'objet attendu est un littéral.Egalité d'objet dans assertEquals

function getRandomIntInclusive(min, max) { 
    min = Math.ceil(min); 
    max = Math.floor(max); 
    return Math.floor(Math.random() * (max - min + 1)) + min; 
} 

function decorateClassListWithAges(classList) { 
    return classList.reduce((arr, c) => { 
    arr.push({ 
     'Name': c, 
     'Age': getRandomIntInclusive(10, 10) //Currently always 10 for test purposes 
    }) 
    return arr 
    }, []) 
} 

function assertEquals(actual, expected, testName) { 

    if (actual == null || typeof actual != 'object') 
    return console.log('FAILED: expected ' + JSON.stringify(expected) + ' but got ' + JSON.stringify(actual)); 

    if (Object.keys(actual).length !== Object.keys(expected).length) 
    return console.log('FAILED: expected ' + JSON.stringify(expected) + ' but got ' + JSON.stringify(actual)); 

    for (let k in actual) 
     if (!expected.hasOwnProperty(k)) 
     return console.log('FAILED: expected ' + JSON.stringify(expected) + ' but got ' + JSON.stringify(actual)); 

     for (let k in expected) { 
      if (actual[k] !== expected[k]) 
      return console.log('FAILED: expected ' + JSON.stringify(expected) + ' but got ' + JSON.stringify(actual)); 
     } 
    return console.log('passed'); 
} 


let a = ['James', 'Paul'] 
let e = [{'Name' : 'James', 'Age' : 10}, {'Name' : 'Paul', 'Age' : 10}] 
assertEquals(decorateClassListWithAges(a), e) 

Répondre

2

Ici, vous essayez de comparer deux objets différents:

for (let k in actual) 
     if (!expected.hasOwnProperty(k)) 
     return console.log('FAILED: expected ' + JSON.stringify(expected) + ' but got ' + JSON.stringify(actual)); 

     for (let k in expected) { 
      if (actual[k] !== expected[k]) 
      return console.log('FAILED: expected ' + JSON.stringify(expected) + ' but got ' + JSON.stringify(actual)); 
     } 

Mais JS deux objets sont égaux si elles se réfèrent à exactement le même objet.

Vous pouvez comparer deux objets en utilisant la méthode lodash isEqual:

if (!_.isEqual(actual[k], expected[k]))... 

extrait Try ci-dessous:

function getRandomIntInclusive(min, max) { 
 
     min = Math.ceil(min); 
 
     max = Math.floor(max); 
 
     return Math.floor(Math.random() * (max - min + 1)) + min; 
 
    } 
 

 
    function decorateClassListWithAges(classList) { 
 
     return classList.reduce((arr, c) => { 
 
     arr.push({ 
 
      'Name': c, 
 
      'Age': getRandomIntInclusive(10, 10) //Currently always 10 for test purposes 
 
     }) 
 
     return arr 
 
     }, []) 
 
    } 
 

 
    function assertEquals(actual, expected, testName) { 
 

 
     if (actual == null || typeof actual != 'object') 
 
     return console.log('FAILED: expected ' + JSON.stringify(expected) + ' but got ' + JSON.stringify(actual)); 
 

 
     if (Object.keys(actual).length !== Object.keys(expected).length) 
 
     return console.log('FAILED: expected ' + JSON.stringify(expected) + ' but got ' + JSON.stringify(actual)); 
 

 
     for (let k in actual) 
 
      if (!expected.hasOwnProperty(k)) 
 
      return console.log('FAILED: expected ' + JSON.stringify(expected) + ' but got ' + JSON.stringify(actual)); 
 

 
      for (let k in expected) { 
 
       if (!_.isEqual(actual[k], expected[k])) 
 
       return console.log('FAILED: expected ' + JSON.stringify(expected) + ' but got ' + JSON.stringify(actual)); 
 
      } 
 
     return console.log('passed'); 
 
    } 
 

 

 
    let a = ['James', 'Paul'] 
 
    let e = [{'Name' : 'James', 'Age' : 10}, {'Name' : 'Paul', 'Age' : 10}] 
 
    assertEquals(decorateClassListWithAges(a), e)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.js"></script>

+0

C'est une bonne idée, mais j'ai entendu fonctionne stringify que si les clés d'objet sont dans le même ordre, dans ce cas elles le sont, mais j'aimerais quand même savoir une comparaison qui ne reposait pas sur l'avenir Je vous remercie – jhazelton1