5

tail -f のように、ファイルを永久に追跡する rxjs オブザーバー (実際にはサブジェクト) があります。たとえば、ログファイルを監視するのに最適です。

この「永久に」動作は、私のアプリケーションには最適ですが、テストにはひどいものです。現在、アプリケーションは動作しますが、テストが永遠にハングします。

私のテストコードはファイルに何行あるべきかを知っているので、オブザーバーの変更を強制的に早期に完了させたいと思っています。どうすればいいですか?

返された Subject ハンドルで onCompleted を呼び出してみましたが、その時点では基本的にオブザーバーとしてキャストされており、強制的に閉じることはできません。エラーは次のとおりです。

オブジェクト # にはメソッド「onCompleted」がありません

ソースコードは次のとおりです。

function ObserveTail(filename) {

source = new Rx.Subject();

if (fs.existsSync(filename) == false) {
    console.error("file doesn't exist: " + filename);
}

var lineSep = /[\r]{0,1}\n/;
tail = new Tail(filename, lineSep, {}, true);

tail.on("line", function(line) {
        source.onNext(line);
});
tail.on('close', function(data) {
    console.log("tail closed");
    source.onCompleted();
});     
tail.on('error', function(error) {
    console.error(error);
});     

this.source = source;
}           

そして、永久に強制的に終了させる方法を理解できないテスト コード (テープ スタイル テスト) を次に示します。「ILLEGAL」行に注意してください。

test('tailing a file works correctly', function(tid) {

var lines = 8;
var i = 0;
var filename = 'tape/tail.json';
var handle = new ObserveTail(filename);
touch(filename);

handle.source
.filter(function (x) {
    try {
        JSON.parse(x);
        return true;
    } catch (error) {
        tid.pass("correctly caught illegal JSON");
        return false;
    }
})
.map(function(x) { return JSON.parse(x) })
.map(function(j) { return j.name })
.timeout(10000, "observer timed out")
.subscribe (
    function(name) {
        tid.equal(name, "AssetMgr", "verified name field is AssetMgr");
        i++;
        if (i >= lines) {
            handle.onCompleted();   // XXX ILLEGAL
        }
    },
    function(err) {  
        console.error(err)
        tid.fail("err leaked through to subscriber");
    },
    function() {
        tid.end();
        console.log("Completed");
    }
);

})
4

1 に答える 1