2017-07-03 15 views
0

問題のオブジェクトにスカラー値(文字列や数値などの単純な値)のみが含まれているアサーションメソッドを作成しようとしています。 JSON.stringify()を使用しても問題ありません。オブジェクトのアサーションを書く

例はPASSED:

var expected = {foo: 5, bar: 6}; 
var actual = {foo: 5, bar: 6} 
objectAssert(actual, expected, 'detects that two objects are equal'); 
// console output: 
// passed 

例がFAILED:

var expected = {foo: 6, bar: 5}; 
var actual = {foo: 5, bar: 6} 
objectAssert(actual, expected, 'detects that two objects are equal'); 
// console output: 
// FAILED [my test] Expected {"foo":6,"bar":5}, but got {"foo":5,"bar":6} 

ここに私の機能はこれまでのところです:私はここに行方不明です何

function objectAssert(actual, expected, testName) { 

if(actual !== expected){ 
    console.error("FAIL [" + testName + "] Expected \"" + expected + ", \" but got \"" + actual + "\""); 
    } else { 
    console.info("SUCCESS [" + testName + "]"); 
    } 
} 

任意のアイデア?

+0

あなたは '==='や '=='オブジェクトの内容を比較するために使用することはできません。オブジェクトを比較するときには、メモリ内の同じ場所にあるかどうかをテストするだけです。 – Barmar

+0

「私はここで何が分からないの?何が欠けていると思いますか? – Quentin

+0

@Barmar '==='はアイデンティティ操作です。オブジェクトが同じメモリ位置になければならないということではありません。それはオブジェクトが同じタイプでなければならないことを意味します。 –

答えて

0

!==を使用してオブジェクトを使用すると間違っています。私がお勧めするのは、あなたが質問で言及したように、JSON.stringifyを使って両方のオブジェクトを比較することです。

例:

function objectAssert(actual, expected, testName) { 

    _actual = JSON.stringify(actual); 
    _expected = JSON.stringify(expected); 

    if(_actual != _expected) 
     console.error("FAIL [" + testName + "] Expected \"" + expected + ", \" but got \"" + actual + "\""); 
    else 
     console.info("SUCCESS [" + testName + "]"); 
} 
0

あなたが比較できるJSON文字列オブジェクト:!

if(JSON.stringify(actual) !== JSON.stringify(expected)){ 
    console.error("FAIL [" + testName + "] Expected \"" + JSON.stringify(expected) + ", \" but got \"" + JSON.stringify(actual) + "\""); 
} else { 
    console.info("SUCCESS [" + testName + "]"); 
} 
+0

私はこの勧告を他の場所で見たことがありますが(重複したとしても)、間違っていると思います。 2つのオブジェクトを文字列化するときにプロパティの順序が同じになるという保証はありません。 – Barmar

関連する問題