2016-07-20 5 views
1

私はTribonacciシーケンス(https://en.wikipedia.org/wiki/Tribonacci_sequence)を実装するnodejsのプログラムを書いています。このシーケンスはフィボナッチに似ていますが、各数字は前の3つの単語の合計です。アサーションテスト2アレイdeepEqual

My機能は素晴らしい作品と次のようになります。問題は、私はそれをテスト主張しようとしているとき、アサーションリターンたびは「未定義」ということである

// 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. 
}; 

...

// 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'); 
}); 
私は($ノードserver.jsで)サーバーを起動していたときに

これが結果です: tribonacci assertion failed

私は機能をチェックし、それがサムを返しますテストで与えられた結果となる。

誰かが私のための解決策を持っていますか?多分私は何か間違っていますか?あなたの将来の助けを

感謝:)

+0

数値を計算するための純粋な関数が 'server.close()'の制御下にありますか?入力が無効であればエラーを投げないのはなぜですか? – naomik

+0

あなたのコメントをありがとうが、それは本当に私の質問のポイントではありません。 –

+0

あなたの質問は、任意の長さの入力に作用するフィボナッチ手順を書くことに興味がありました。私はここでそれを共有します[gist:polynacci.js](https://gist.github.com/naomik/22f614dc0d3fa4e99e9bf309c333b028) – naomik

答えて

0

assert.*関数は渡されたアサーションが発生した場合に出力を持っていません。アサーションが失敗した場合にのみ、エラーメッセージTrueを出力します。

アサーションが1つ失敗した場合は、throwエラーが発生し、プログラムが停止します。だからあなたはこの&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'); 

// ... 

エラーがスローされていますので、アサーションの一つが失敗した場合、res.writeラインを実行しないことが保証されています。


ことがあるので、これはあなた

の問題のように聞こえるはずです。サーバー内にエラーを投げる(そしてキャッチしない)と、テストアサーションのいずれかが失敗するたびにサーバーがクラッシュします。うまくいけば、これは、これがプログラムの全体的な構造を記述するための非常に悪い方法であることをあなたに示します。

+0

あなたの答えをありがとう、それは私の必要な解決策です! –

+0

もっと多目的なテストスイートを書くための[substack/tape](https://github.com/substack/tape)(または他のテストライブラリ)を調べてください。ここでやっているようにブラウザウィンドウでテストを実行することもできます。違いは実装コードであり、テストスイートはサーバーと応答内部との結合を持たないでしょう。それは事を行うより良い方法です。 – naomik