假设我绑定operation hook
用于测试目的,如下所示:
it('verification link confirms mail',function(done){
var client = app.models.client;
client.observe('after save', function(ctx, next) {
if (!ctx.instance.verificationToken){
next();
return;
}
var link = '/api/clients/confirm?uid=' + ctx.instance.id + '&redirect=/verified&token=' + ctx.instance.verificationToken;
json('get', link)
.send()
.expect(200, function(){
client.findById(ctx.instance.id, function(err, inst){
assert(inst.emailVerified === true);
done();
});
});
next();
});
client.create({username:'test',email : 'a@b.com', password : 'test'}, function(err){
if(err) {
assert.fail('could not create client instance','',err);
}
});
});
问题是创建client
实例的所有后续测试都有此操作挂钩。有没有办法解开它?
答案 0 :(得分:1)
我不认为环回提供了一种安全地观察操作挂钩的方法。我认为他们使用Object.observe
方法在某些javaScript实现中过时了。我建议你尝试一下这样的事情:
client.unobserve('after save', function (ctx, next) {
//do something after the change is un-observed in the object
});
我希望你能发现它有用。
您可以阅读更详细的内容here。 这是一个过时的功能,所以要小心。
答案 1 :(得分:0)
实际上正在浏览loopback-datasource-juggler
源代码,我找到了取消绑定operation hook
的方法。函数Model.removeObserver('event',call)
完成了这项工作。这是更新的代码:
it('verification link confirms mail',function(done){
function observeClient(ctx, next) {
if (!ctx.instance.verificationToken){
next();
return;
}
var link = '/api/clients/confirm?uid=' + ctx.instance.id + '&redirect=/verified&token=' + ctx.instance.verificationToken;
json('get', link)
.send()
.expect(200, function(){
client.findById(ctx.instance.id, function(err, inst){
assert(inst.emailVerified === true);
client.removeObserver('after save',observeClient);//unbind
done();
});
});
next();
}
var client = app.models.client;
client.observe('after save', observeClient);
client.create({username:'andi',email : 'andi@b.com', password : 'test'}, function(err){
if(err) {
assert.fail('could not create client instance','',err);
}
});
});
可以找到测试用例示例here