申し訳ありませんが、ノードから始めてください。これは非常に初歩的な質問かもしれません。
ファイルシステムのディレクトリからいくつかのファイルを読み取るコードがあるとしましょう:
var fs = require('fs');
fs.readdir(__dirname + '/myfiles', function (err, files) {
if (err) throw err;
files.forEach(function (fileName) {
fs.readFile(__dirname + '/myfiles/' + fileName, function (err, data) {
if (err) throw err;
console.log('finished reading file ' + fileName + ': ' + data);
module.exports.files.push(data);
});
});
});
これはすべて非同期で行われることに注意してください。また、次のコードを実行する Mocha テストがあるとします。
describe('fileProvider', function () {
describe('#files', function () {
it.only('files array not empty', function () {
assert(fileProvider.files.length > 0, 'files.length is zero');
});
});
});
mocha テストは、ファイルの読み取りが完了する前に実行されます。これは、mocha テストが実行されていることを示す小さなドットが表示された後に console.log ステートメントが表示されるためです (少なくとも、それが示されていると思います)。また、アサートを setTimeout で囲むと、アサートはパスします。
非同期ファイル操作が確実に完了するようにするには、コードをどのように構成すればよいですか? これはテストの問題だけではないことに注意してください。アプリで実際の作業を行う前に、ファイルを完全にロードする必要があります。
ファイルを同期的に読み取ることが正しい答えだとは思いません。ノードの要求/応答ループがブロックされるからですよね?
おまけの質問:
タイムアウト値が 0 の setTimeout にアサートを入れても、テストは成功します。これは、 setTimeout に入れるだけで、処理チェーンの最後までキックするか、ファイルシステムの作業が最初に終了するためですか?