2016-07-17 9 views
0

私は何が起こるかを見るためにいくつかのBASICテストを書くことによってコールバックを理解しようとしています。私はこれを実行するためにモカを使用しています。私は明らかにコールバックを初めて使う人ですが、なぜこれが機能しないのか分かりません。ノード/ jsのREALLY基本コールバック

import fs from 'fs'; 


describe('named callbacks', function() { 
it('runs something using callbacks', function() { 

    function runTest() { 
     return fs.readFile('test.txt', onReadFile); 

     function onReadFile(err, data) { 
      if (err) { 
       console.log('error reading file', err); 
       return err; 
      } 
      fs.writeFile('testoutfile.txt', data, onWriteFile); 
     } 

     function onWriteFile(err, data) { 
      if (err) { 
       console.log('write error', err); 
       return err; 
      } 
      console.log('file written!', data); 
     } 

    } 

    runTest(); 
}); 
}); 

テスト実行、それは出力ファイルを作成しますが、何もそれに書き込まれません取得し、エラーがログに記録されません。

私はプログラムを上から下に書くのに慣れていますが、このコールバックは私のようなものを混乱させます。私はここにすべてのコールバックを命名しているので、私はそのロジックに従おうとすることができます。私は本当にこれがうまくいかない理由を理解したいと思います。

+5

テストフレームワークを同時に処理することなくコールバックを理解することをお勧めしますか? – Brad

+2

テスト自体はコールバックを待っていません。 – SLaks

+0

「hello world」と書かれているtest.txtの内容。 – Coco

答えて

0

あなたのテストが非同期であることをモカに宣言する必要があります。これは、約束を返すか、doneコールバックを使用するという2つの方法のいずれかで行います。あなたが持っているコードは、後者に自分自身を貸す:

describe('named callbacks', function() { 
it('runs something using callbacks', function(done) { 

    function runTest() { 
     return fs.readFile('test.txt', onReadFile); 

     function onReadFile(err, data) { 
      if (err) { 
       console.log('error reading file', err); 
       done(err); 
      } 
      fs.writeFile('testoutfile.txt', data, onWriteFile); 
     } 

     function onWriteFile(err, data) { 
      if (err) { 
       console.log('write error', err); 
       done(err); 
      } 
      console.log('file written!', data); 
      done(); 
     } 

    } 

    runTest(); 
}); 
}); 

変更は以下のとおりです。

  1. itに渡された関数へのパラメータとしてdoneを追加します。

  2. return errdone(err)に置き換えます。これは、エラーをMochaに渡します。

  3. onWriteFile機能の最後にdone()を追加します。

関連する問題