我有一个 rxjs 观察者(实际上是一个主题),它永远跟踪一个文件,就像 tail -f 一样。例如,监视日志文件非常棒。
这种“永远”的行为对我的应用程序来说很棒,但对测试来说却很糟糕。目前我的应用程序有效,但我的测试永远挂起。
我想强制观察者更改提前完成,因为我的测试代码知道文件中应该有多少行。我该怎么做呢?
我尝试在返回的主题句柄上调用 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;
}
这是无法弄清楚如何强制永远结束的测试代码(磁带式测试)。注意“非法”行:
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");
}
);
})