2016-07-20 22 views
1

Ich schreibe ein Programm in Nodejs, die die Tribonacci-Sequenz (https://en.wikipedia.org/wiki/Tribonacci_sequence) implementieren. Diese Sequenz ist wie die Fibonacci, aber jede Zahl ist die Summe der vorherigen 3 Wörter.Assertion testen 2 Arrays deepEqual

Meine Funktion funktioniert gut und sieht wie folgt aus:

// the tribonacci function 
// param signature : the signature which with the function will the start the rest of the tribonacci 
// param iterations : how many numbers will be returned with this function 
function tribonacci(signature, iterations) { 
    if (signature.length == 3) { // the signature must be 3 numbers length 
     var tribonacci_sequence = []; // our array that will cointains the fibonacci sequence 

     for (i = 0; i < iterations; i++) { 
      if (i < 3) { // to initialize our tribonacci sequence to the three numbers of signature 
       tribonacci_sequence[i] = signature[i]; 
      } 
      else { // now we can complete our sequence with the rest of tribonacci 
       tribonacci_sequence[i] = tribonacci_sequence[i-1] + tribonacci_sequence[i-2] + tribonacci_sequence[i-3]; 
      } 
     } 

     return tribonacci_sequence; 
    } 

    server.close(); // the signature is not 3 numbers length, the tribonacci sequence cannot be done. 
}; 

Das Problem ist, dass, wenn ich es zu behaupten, ich versuche zu testen, die Behauptung Rückkehr jedes Mal ‚undefined‘ ...

// create the server function 
const server = http.createServer((req, res) => { 
    res.statusCode = 200; 
    res.setHeader('Content-Type', 'text/plain'); 

    // let's start our tests 
    res.write('tribonacci([1,1,1],10) = [1,1,1,3,5,9,17,31,57,105] ? ' + 
     assert.deepEqual(tribonacci([1,1,1],10), [1,1,1,3,5,9,17,31,57,105], 'True') + '\n' 
    ); 
    res.write('tribonacci([0,0,1],10) = [0,0,1,1,2,4,7,13,24,44] ? ' + 
     assert.deepEqual(tribonacci([0,0,1],10), [0,0,1,1,2,4,7,13,24,44], 'True') + '\n' 
    ); 
    res.write('tribonacci([0,1,1],10) = [0,1,1,2,4,7,13,24,44,81] ? ' + 
     assert.deepEqual(tribonacci([0,1,1],10), [0,1,1,2,4,7,13,24,44,81], 'True') + '\n' 
    ); 
    res.write('tribonacci([1,0,0],10) = [1,0,0,1,1,2,4,7,13,24] ? ' + 
     assert.deepEqual(tribonacci([1,0,0],10), [1,0,0,1,1,2,4,7,13,24], 'True') + '\n' 
    ); 
    res.write('tribonacci([0,0,0],10) = [0,0,0,0,0,0,0,0,0,0] ? ' + 
     assert.deepEqual(tribonacci([0,0,0],10), [0,0,0,0,0,0,0,0,0,0], 'True') + '\n' 
    ); 
    res.write('tribonacci([1,2,3],10) = [1,2,3,6,11,20,37,68,125,230] ? ' + 
     assert.deepEqual(tribonacci([1,2,3],10), [1,2,3,6,11,20,37,68,125,230], 'True') + '\n' 
    ); 
    res.write('tribonacci([3,2,1],10) = [3,2,1,6,9,16,31,56,103,190] ? ' + 
     assert.deepEqual(tribonacci([3,2,1],10), [3,2,1,6,9,16,31,56,103,190], 'True') + '\n' 
    ); 
    res.write('tribonacci([1,1,1],1) = [1] ? ' + 
     assert.deepEqual(tribonacci([1,1,1],1), [1], 'True') + '\n' 
    ); 
    res.write('tribonacci([300,200,100],0) = []) ? ' + 
     assert.deepEqual(tribonacci([300,200,100],0), [], 'True') + '\n' 
    ); 
    res.write('tribonacci([0.5,0.5,0.5],30) = [0.5,0.5,0.5,1.5,2.5,4.5,8.5,15.5,28.5,52.5,96.5,177.5,326.5,600.5,1104.5,2031.5,3736.5,6872.5,12640.5,23249.5,42762.5,78652.5,144664.5,266079.5,489396.5,900140.5,1655616.5,3045153.5,5600910.5,10301680.5]) ? ' + 
     assert.deepEqual(tribonacci([0.5,0.5,0.5],30), [0.5,0.5,0.5,1.5,2.5,4.5,8.5,15.5,28.5,52.5,96.5,177.5,326.5,600.5,1104.5,2031.5,3736.5,6872.5,12640.5,23249.5,42762.5,78652.5,144664.5,266079.5,489396.5,900140.5,1655616.5,3045153.5,5600910.5,10301680.5], 'True') + '\n' 
    ); 

    // the res must end 
    res.end('\n'); 
}); 

Das ist das Ergebnis, wenn ich den Server starte (mit $ node server.js): tribonacci assertion failed

Ich überprüfte die Funktion, es gibt die sam es Ergebnisse wie in den Tests angegeben.

Jemand hat eine Lösung für mich? Vielleicht mache ich etwas falsch?

Vielen Dank für Ihre Zukunft Hilfe :)

+0

eine könnte reine Funktion für die Berechnung von Zahlen ist in der Kontrolle von 'server.close()'? Warum nicht einen Fehler werfen, wenn die Eingaben ungültig sind? – naomik

+0

Danke für Ihren Kommentar, aber das ist nicht wirklich der Punkt meiner Frage. –

+0

Ihre Frage interessiert mich beim Schreiben einer Fibonacci-Prozedur, die auf eine Eingabe beliebiger Länge funktioniert. Ich werde es hier teilen [gist: polynacci.js] (https://gist.github.com/naomik/22f614dc0d3fa4e99e9bf309c333b028) – naomik

Antwort

0

assert.* Funktionen im Falle einer bestandenen Behauptung keinen Ausgang haben. Sie geben nur die Fehlernachricht True aus, falls eine Assertion fehlschlägt.

Wenn eine einzelne Assertion fehlschlägt, wird throw ein Fehler und Ihr Programm anhalten. So könntest du dein Programm so schreiben & hellip;

// let's start our tests 
assert.deepEqual(tribonacci([1,1,1],10), [1,1,1,3,5,9,17,31,57,105]) 
res.write('tribonacci([1,1,1],10) = [1,1,1,3,5,9,17,31,57,105] ? True' + '\n'); 

assert.deepEqual(tribonacci([0,0,1],10), [0,0,1,1,2,4,7,13,24,44]) 
res.write('tribonacci([0,0,1],10) = [0,0,1,1,2,4,7,13,24,44] ? True' + '\n'); 

// ... 

Mit anderen Worten sind die res.write Linien garantiert nicht laufen, wenn eine der Behauptungen schlägt fehl, weil ein Fehler ausgelöst worden sein.


Dieses wie ein Problem für Sie

Weil es klingen sollte. Wenn Sie einen Fehler im Server auslösen (und ihn nicht abfangen), stürzt der Server jedes Mal ab, wenn eine der Testbehauptungen fehlschlägt. Hoffentlich deutet das darauf hin, dass dies ein sehr schlechter Weg ist, die Gesamtstruktur des Programms zu schreiben.

+0

Danke für Ihre Antwort, das ist die Lösung, die ich brauchte! –

+0

Schauen Sie in [substack/tape] (https://github.com/substack/tape) (oder eine andere Testbibliothek), um eine vielseitigere Testsuite zu schreiben. Sie können die Tests auch in einem Browserfenster ausführen, wie Sie es hier tun. Der Unterschied ist Ihr Implementierungscode und die Testsuite wird keine Verbindung mit dem Server und den internen Antworten haben. Es ist ein viel besserer Weg, Dinge zu tun. – naomik