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

时间:2013-02-01 11:15:14

标签: javascript dojo doh

有没有人知道如何使用doh来测试某个对象是否订阅了特定主题?

我很难找到任何描述此类测试的文档。

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

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

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

define([], function(){

    var topicString= "topicString";

    return {
        TOPIC_STRING: function(){
            return topicString;
        }
    }
})

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

constructor: function() {   
    topic.subscribe(CustomTopic.TOPIC_STRING(), function(params) {doSomething(params)});
}

因此,如果我能够弄清楚如何查看我的小部件所有的订阅,那么您可以看到检查主题订阅与私有变量值是多么容易?

供参考:

Dojo 1.8 docs

Dojo's test util "doh" docs

1 个答案:

答案 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。