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 документы

Dojo's test util документы "doh"

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 до некоторой более поздней стадии.

Другие вопросы по тегам