有没有人知道如何使用doh来测试某个对象是否订阅了特定主题?
我很难找到任何描述此类测试的文档。
我问这个的原因是因为我构建我的小部件时我订阅了一个主题。我想进行一个单元测试,测试小部件在构建之后是否总是有该主题订阅。
我的主题有一个私有变量,我在创建订阅时将其用作主题字符串。
例如,这里有一个名为“CustomTopic”的主题:
define([], function(){
var topicString= "topicString";
return {
TOPIC_STRING: function(){
return topicString;
}
}
})
我的小部件中的构造函数如下所示:
constructor: function() {
topic.subscribe(CustomTopic.TOPIC_STRING(), function(params) {doSomething(params)});
}
因此,如果我能够弄清楚如何查看我的小部件所有的订阅,那么您可以看到检查主题订阅与私有变量值是多么容易?
供参考:
答案 0 :(得分:2)
如果专注于行为而不是实现,我建议您的测试将更加强大/有用。在这种情况下,测试您的小部件是否响应主题(或更好的是导致主题发布的事件,更多的集成测试)而不是尝试捕获订阅本身更有意义。 / p>
当然,您可以尝试包装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。