Javascript Dojo和doh:测试特定主题订阅

Javascript Dojo和doh:测试特定主题订阅,javascript,dojo,doh,Javascript,Dojo,Doh,有人知道使用doh测试对象是否订阅了特定主题的方法吗 我很难找到任何描述这种测试的文档 我问这个问题的原因是,当我构建我的小部件时,我订阅了一个主题。我想做一个单元测试,测试小部件在构建之后是否总是有主题订阅 我的主题有一个私有变量,在创建订阅时用作主题字符串 例如,这里有一个名为“CustomTopic”的主题: 我的小部件中的构造函数如下所示: constructor: function() { topic.subscribe(CustomTopic.TOPIC_STRING(

有人知道使用doh测试对象是否订阅了特定主题的方法吗

我很难找到任何描述这种测试的文档

我问这个问题的原因是,当我构建我的小部件时,我订阅了一个主题。我想做一个单元测试,测试小部件在构建之后是否总是有主题订阅

我的主题有一个私有变量,在创建订阅时用作主题字符串

例如,这里有一个名为“CustomTopic”的主题:

我的小部件中的构造函数如下所示:

constructor: function() {   
    topic.subscribe(CustomTopic.TOPIC_STRING(), function(params) {doSomething(params)});
}
因此,如果我能找出如何查看我的小部件拥有的所有订阅,那么您可以看到根据私有变量值检查主题订阅是多么容易

供参考:


我建议,如果您的测试专注于行为而不是实现,那么它将更加健壮/有用。在这种情况下,测试您的小部件是否响应主题(或者更好的是,对于更多的集成测试,测试导致主题发布的事件)比尝试捕获订阅本身更有意义

当然,您可以尝试包装topic.subscribe(一件坏事),或者检查小部件的私有句柄列表(另一件坏事)。顺便说一句,我希望您实际上是在保存topic.subscribe返回的句柄,以便在对象销毁后可以删除(以前称为取消订阅)

比这更好的方法是简单地创建一个新对象,发布到该主题,然后查看是否调用了doSomething,或者是否出现了所需的结果。虽然doh不支持监听函数调用,但dojo/aspect是实现这一目的的理想选择。所以你可能会有这样的想法:

var myWidget = new myWidget(); // presumably subscription happened, 
                               // but we only care about later behaviour
var somethingDone = false;
aspect.after(window, "doSomething", function(){somethingDone = true;});
topic.publish(CustomTopic.TOPIC_STRING());
doh.assertTrue(somethingDone);

事实上,我假设doSomething不是一个全局方法,所以您必须正确地确定其范围,否则这应该可以正常工作。目前topic.publish是同步的,因此应该可以正常工作,但将来可能会变为异步,在这种情况下,您希望在以后的某个阶段之前避免调用doh.assertTrue。

FYI:
\u WidgetBase
提供了一种订阅方法,当小部件被销毁时,该方法将取消订阅。谢谢McDowell,很高兴知道。我很感谢您的来历,检查所需的行为是否得到满足是我考虑过的,并且可能是我最终编写测试的方式。然而,我真的只是想知道如何查看特定对象的所有订阅。必须在某个地方订阅函数映射?基本上,我希望为widget.pre 1.7的所有主题订阅找到一个getter(我的大部分工作仍然使用1.4.3=()你会使用这个。subscribe()在任何混合了_widget的类中,这会将订阅添加到一个内部数组(_subscribes或类似的东西,肯定是专用的)你可以想象得到,在1.7中,模式是这样的。own(handle1,handle2);对于混合在WidgetBase中的类,我不知道它在哪里存储句柄,但我保证它是私有的。你可以简单地实现自己的句柄数组,但这似乎是额外的工作。实际上,不,我只是检查了,this.own(此处定义:)实际上不使用内部数组,因此这里没有运气。
var myWidget = new myWidget(); // presumably subscription happened, 
                               // but we only care about later behaviour
var somethingDone = false;
aspect.after(window, "doSomething", function(){somethingDone = true;});
topic.publish(CustomTopic.TOPIC_STRING());
doh.assertTrue(somethingDone);