node.js で最初のステップを実行し、自分のコードをテストしたいのですが、行き詰まっています。node-qunitライブラリをテスト ツールとして使用します。
これが私のコードです:
var spawn = require('child_process').spawn;
var ok = require('assert').ok;
function _call_gpg(stdin_pass, passphrase, decrypt, callback) {
ok(stdin_pass);
ok(passphrase);
var buffers = [];
var gpg = spawn('gpg', ['--passphrase', passphrase, decrypt ? '-d' : '-c', '--no-use-agent']);
gpg.stdout.on('data', function(data) {
buffers.push(data);
});
gpg.on('exit', function(return_code) {
callback(return_code === 0 ? Buffer.concat(buffers) : undefined);
});
gpg.stdin.write(stdin_pass);
gpg.stdin.end();
}
function encrypt(string, passphrase, callback) {
ok(typeof callback === 'function');
_call_gpg(string, passphrase, false, function(buf) {
callback(buf && buf.toString('base64'));
});
}
function decrypt(encoded_string, passphrase, callback) {
ok(typeof callback === 'function');
raw_encoded_string = new Buffer(encoded_string, 'base64');
_call_gpg(raw_encoded_string, passphrase, true, function(buf) {
callback(buf && buf.toString('utf8'));
});
}
exports.encrypt = encrypt;
exports.decrypt = decrypt;
インタラクティブ コンソールからこの関数を呼び出すと、期待どおりに機能します。しかし、以下のコードを使用して非同期でテストしようとすると、2 番目strictEqual
が機能することもあれば、失敗することもあります。
asyncTest('encrypting and decrypting', function() {
encrypt('foo', 'pass', function(encoded_string) {
decrypt(encoded_string, 'pass', function(decoded_string) {
strictEqual('foo', decoded_string, 'encryption and decryption work');
});
});
decrypt('jA0EAwMCNiwPDFiMxvFgyRmB4axFyanuy2DZmB0ZIUfpXcASCKT8pwFm', 'pass', function(decoded_string) {
strictEqual('foo', decoded_string, 'only decryption works');
});
setTimeout(function() { start(); }, 10000);
});
この機能を別々にテストすると、両方が機能するため、非同期性に問題があるようです。
助けてくれてありがとう。