2017-09-18 18 views
0

2つのオブジェクトを比較しようとしていますが、最初に同じキーがある場合はキー値が等しい場合でもassertEqualsのテストは失敗します。 2つのオブジェクトが配列内にあるので、実際にはオブジェクトの1つの配列とオブジェクトの別の配列を比較しているからです。また、私の実際のオブジェクトは関数から作られ、期待されるオブジェクトはリテラルです。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) 

答えて

2

ここでは、2つの異なるオブジェクトを比較してみてください:

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)); 
     } 

しかし、彼らはまったく同じオブジェクトを参照する場合はJSで2つのオブジェクトが等しい

あなたはlodash isEqual方法使用して、この2つのオブジェクトを比較することができます怒鳴る

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

てみスニペット:

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

良いアイデアだが、私は場合にのみ機能します文字列化を聞きましたオブジェクトのキーは同じ順序であり、この場合は同じですが、私はまだ文字列化に頼らない比較を知りたいです未来ありがとうございました – jhazelton1