2016-10-15 4 views
0

Ich schrieb eine Funktion, dass, wenn eine Liste von Objekten und eine id gegeben, die gleiche Liste zurückgibt, aber mit dem entsprechenden Objekt als aktiv markiert (alle anderen Objekte sollten nicht aktiv sein).Chai bezogene Fehlermeldung: „AssertionError: undefined erwartet tief gleich“

const list = [ 
    { id: 1, active: false }, 
    { id: 2, active: false }, 
    { id: 3, active: true }, 
    { id: 4, active: false } 
]; 

function markActive(list, value) { 
    list.forEach((id) => { 
    if (id.active = (id.id === value)) { 
     return true; 
    } else { 
     return false; 
    } 
    }); 
} 

markActive(list, 2); 
console.log(list) 

Returns:

[ { id: 1, active: false }, 
    { id: 2, active: false }, 
    { id: 3, active: false }, 
    { id: 4, active: true } ] 

Es ist wie ein Zauber funktioniert, außer wenn ich "npm run [Dateiname]" laufen bekomme ich eine Fehlermeldung:

Running Tests for [filename]. 
------------ 
[ { id: 1, active: false }, 
    { id: 2, active: false }, 
    { id: 3, active: false }, 
    { id: 4, active: true } ] 


    markActive 
    1) Case 1 (Given Sample) 
    2) Case 2 (String IDs) 


    0 passing (16ms) 
    2 failing 

    1) markActive Case 1 (Given Sample): 
    AssertionError: expected undefined to deeply equal [ { id: 1,   
    active: false }, 
    { id: 2, active: true }, 
    { id: 3, active: false }, 
    { id: 4, active: false } ] 
    at Function.assert.deepEqual    
    (node_modules/chai/lib/chai/interface/assert.js:216:32) 
     at Context.it (tests/test_02.js:23:12) 

    2) markActive Case 2 (String IDs): 
    AssertionError: expected undefined to deeply equal [ { id: '1',  
    active: false }, 
    { id: '2', active: true }, 
    { id: '3', active: false }, 
    { id: '4', active: false } ] 
    at Function.assert.deepEqual 
    (node_modules/chai/lib/chai/interface/assert.js:216:32) 
    at Context.it (tests/test_02.js:40:12) 

Jede Idee, was ich mache ich falsch? Hier ist der Code, der die Tests aufstellt:

const chai = require("chai"); 
const sinon = require("sinon"); 
const assert = chai.assert; 

const markActive = require("../answers/02.js"); 

describe("markActive",() => { 

    it("Case 1 (Given Sample)",() => { 
    var list = [ 
     { id: 1, active: false }, 
     { id: 2, active: false }, 
     { id: 3, active: true }, 
     { id: 4, active: false } 
     ]; 
    var newList = markActive(list, 2); 
    var targetList = [ 
     { id: 1, active: false }, 
     { id: 2, active: true }, 
     { id: 3, active: false }, 
     { id: 4, active: false } 
     ]; 
    assert.deepEqual(newList, targetList); 
    }); 

    it("Case 2 (String IDs)",() => { 
    var list = [ 
     { id: "1", active: false }, 
     { id: "2", active: false }, 
     { id: "3", active: true }, 
     { id: "4", active: false } 
     ]; 
    var newList = markActive(list, "2"); 
    var targetList = [ 
     { id: "1", active: false }, 
     { id: "2", active: true }, 
     { id: "3", active: false }, 
     { id: "4", active: false } 
     ]; 
    assert.deepEqual(newList, targetList); 
    }); 

}); 
+0

Bitte bearbeiten Sie Ihre Frage und fügen Sie den Code für die fehlgeschlagenen Tests hinzu. – Soviut

+0

Meinst du den Code, den ich verwendet habe, um den Test einzurichten? –

Antwort

1

Ihre Funktion ist nichts Rückkehr so ​​dass alle Variablen, die Sie versuchen, auf das Ergebnis eingestellt wird als undefined eingestellt werden.

Um dies zu beheben, fügen Sie einfach eine return Anweisung an das Ende Ihrer Funktion.

function markActive(list, value) { 
    list.forEach((id) => { 
    if (id.active = (id.id === value)) { 
     return true; 
    } else { 
     return false; 
    } 
    }); 

    return list; // return the updated list 
} 

HINWEIS: Es ist erwähnenswert, dass, da das Array referenziert wird, werden Sie die Werte an Ort und Stelle zu ändern. Aus diesem Grund hat das Array, das Sie außerhalb der Funktion definiert haben, immer noch aktualisierte Ergebnisse, obwohl Sie den zurückgegebenen Wert nicht protokolliert haben. Dies kann unbeabsichtigte Nebenwirkungen haben, wenn Sie die Funktion markActive() mehrmals in derselben Liste ausführen. Wenn Sie möchten, dass eine neue Liste zurückgegeben wird, prüfen Sie, wie Sie Arrays in Javascript kopieren und tief kopieren.

+0

ARGH! Was für ein dummer Fehler. Das ist es. Vielen Dank! –

Verwandte Themen