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

Posted

技术标签:

【中文标题】Dojo 和 doh:测试特定主题订阅【英文标题】:Dojo and doh: test for specific topic subscriptions 【发布时间】:2013-02-01 11:15:14 【问题描述】:

有谁知道使用 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

【问题讨论】:

仅供参考:_WidgetBase 提供了一个订阅方法,该方法将在小部件被销毁时取消订阅。 感谢 McDowell 很高兴知道。 【参考方案1】:

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

当然,您可以尝试包装 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。

【讨论】:

我很欣赏您的来历,检查是否满足了所需的行为是我考虑过的事情,并且可能是我最终编写测试的方式。但是我真的只是想知道如何查看特定对象的所有订阅。必须在某处订阅函数映射?基本上我希望为一个小部件的所有主题订阅找到一个吸气剂。 pre 1.7(我的大部分工作仍然使用 1.4.3 =( ) 你可以在任何混合 _Widget 的类中使用 this.subscribe(),这会将订阅添加到内部数组( _subscribes 或类似的东西,绝对是私有的),你可以想象一下。在 1.7 中,模式是 this.own(handle1, handle2); 对于混合在 _WidgetBase 中的类,我不知道它在哪里存储句柄,但我保证它是私有的。您可以简单地实现自己的句柄数组,但这似乎是额外的工作。 其实,没有,我刚查了一下,this.own(定义在这里:Destroyable)实际上没有使用内部数组,所以没有运气。

以上是关于Dojo 和 doh:测试特定主题订阅的主要内容,如果未能解决你的问题,请参考以下文章

类似于 dojo DOH 的 Javascript 测试框架

执行 DOH 测试时如何添加“has”模块?

Dojo DOH 怎么了?

如何在 Travis CI 上设置 Dojo Doh 单元测试?

如何在 Dojo DOH 测试中运行服务器 url

Google Firebase 通知无法订阅主题