该测试是使用Jasmine的Angular 2应用程序。
我具有开始与remote DB
同步的功能(仅从Couchbase到PouchDB的一种方式)。有些服务基本上订阅了复制事件上发出的可观察对象。现在,我被要求测试发出的同步状态是否正确,并且由于服务文件的测试覆盖率低而阻止了部署。
所以我用本地startSync
数据库和远程pouchdb
对象调用couchdb
。我如何才能测试每个事件侦听器发出正确的结果?我试图遍历replicate.js的代码,但是我也没有任何线索。有任何提示吗?
基本上,当我模拟/生成“错误”事件时,我想测试发射状态为“假”。
@Injectable()
export class SyncingService {
private subscription: any;
public syncingState: any = new BehaviorSubject<boolean>(false);
private emitResult(state: boolean) {
this.syncingState.next(state);
}
public startSync(localPouch: any, remoteDB: any, config: any) {
let vm: any = this;
this.subscription = localPouch.replicate
.from(remoteDB, { live: true, retry: true })
.on("paused", err => {
vm.emitResult(false);
})
.on("active", info => {
vm.emitResult(false);
})
.on("change", change => {
vm.emitResult(true);
})
.on("error", error => {
vm.emitResult(false);
});
}
}
我认为您可以执行以下操作,例如将remoteDB更改为无效以触发“已暂停”,并抛出“已暂停”或“更改”以触发“错误”。即:
this.subscription = localPouch.replicate
.from("127.0.0.1", { live: true, retry: true })
// bad server most likely gets paused with these flags
.on("paused", err => {
throw(new Error("oops")); // cause an unrecoverable error instead?
vm.emitResult(false);
})
.on("active", info => {
vm.emitResult(false);
})
.on("change", change => {
vm.emitResult(true);
})
.on("error", error => {
vm.emitResult(false);
});
}
}
活动可能是最容易触发的,方法是从另一个localdb复制并在复制等待更改时将其添加到它,如果允许,在remoteDB中更新文档也可以。