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)});
}
Таким образом, вы можете видеть, как легко было бы проверить подписку на тему по значению закрытой переменной, если бы я мог просто выяснить, как просмотреть все подписки, которые есть у моего виджета?
Для справки:
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 до некоторой более поздней стадии.