2015-08-10 3 views
2

Я использую Mocha/Chai для тестирования кода интерфейса JavaScript, и теперь мы переключились на TypeScript. У меня есть несколько функций, которые я хочу проверить. Но они не должны быть экспортируемыми. Могу ли я получить доступ к этим функциям и протестировать его, не добавляя к ним export?Тестирование функции TypeScript, которая не экспортируется

+4

Я думаю, что это общее программирование; модульные тесты не должны фокусироваться на частных методах. Если у вас есть частные методы, которые не покрываются определенным использованием публичных методов, тогда просто избавляйтесь от них. Если они охвачены использованием общедоступных методов, используйте эти общедоступные методы. (Упрощенная точка зрения, но это идея) – Katana314

+0

Как вы справляетесь с этими проблемами перед переключением на TypeScript? – Artem

ответ

5

Там нет никакого способа, чтобы получить доступ к неэкспортированной функции модуля.

module MyModule { 
    function privateFunction() { 
     alert("privateFunction"); 
    } 
} 
MyModule.privateFunction(); // Generates a compiler error 

Однако, оставляя в стороне вопрос о действительности частного тестирования методов, вот что вы можете сделать.

Сгруппируйте свои функции в класс утилиты, а затем используйте тот факт, что к частным членам класса можно получить доступ через квадратную скобку.

module MyModule { 
    export class UtilityClass { 
     private privateFunction() { 
      alert("privateFunction"); 
     } 
    } 
} 
var utility = new MyModule.UtilityClass(); 
//utility.privateFunction(); Generates a compiler error 
utility["privateFunction"](); // Alerts "privateFunction" 
0

Но они не должны быть экспортируемыми. Могу ли я получить доступ к этим функциям и проверить его, не добавляя к ним экспорт?

В общем, нет. Можно получить доступ к членам частного класса, но не к невыполненным членам модулей.

Я бы ответил на комментарии @ Katana314 - модульные тесты не должны относиться к ним с помощью непубличных методов. Попытка сделать это - это указание на то, что вы проверяете детали реализации модуля, а не контракт, который модуль требует реализовать.

+0

Итак, я должен экспортировать функцию, если я хочу ее протестировать или заменить на заглушку. Я прав? – michaeluskov

+0

Конкуренция заключается в том, что вы не должны экспортировать что-то исключительно для тестирования. Вы тестируете модуль, чтобы убедиться, что передача в наборе значений дает ожидаемые результаты, а не внутренний поток обработки внутри модуля. – Brocco

1

Как вы можете видеть в связанных с этим вопросов вопрос о проверке частных функций внутри классов или модулей сильно обсуждавшихся на StackOverflow - следующее может быть архитектурное решение даже не это обсуждение:

Если эти функции чувствовать себя важными достаточно для тестирования отдельно, но не должны быть доступны как часть модуля, должны ли они быть размещены в их собственном модуле?

Это позволит решить вашу проблему доступности - теперь они являются публичными функциями в одном модуле, и вы можете легко использовать их из другого модуля, а не подвергать их как часть этого модуля.

-2

Это общая хак, но эй ...

window.testing = {}; 

Затем в модуле:

module.exports = { 
    myPublicFunction: myPublicFunction 
}; 

window.testing.myModule = { 
    myPublicFunction: myPublicFunction, 
    myPrivateFunction: myPrivateFunction 
}; 
Смежные вопросы