Хобрук: Ваш путь к мастерству в программировании

Шаблон модуля Javascript - как выявить все методы?

У меня есть шаблон модуля, сделанный следующим образом:

var A = (function(x) {
   var methodA = function() { ... }
   var methodB = function() { ... }
   var methodC = function() { ... }
   ...
   ...
   return {
      methA: methodA,
      methB: methodB
   }
})(window)

Этот код позволяет мне вызывать только methA и methB() на A, что я хочу и что мне нравится. Теперь проблема, которая у меня есть: я хочу провести модульное тестирование без боли или, по крайней мере, с минимальными усилиями.


Во-первых Хотя я могу просто вернуть this, но ошибся. Он возвращает объект window (может кто-нибудь объяснить, почему?).

Второе – я нашел решение где-то в Интернете – включить этот метод в мой блок возврата:

__exec: function() {
    var re = /(\(\))$/,
        args = [].slice.call(arguments),
        name = args.shift(),
        is_method = re.test(name),
        name = name.replace(re, ''),
        target = eval(name);
    return is_method ? target.apply(this, args) : target;
}

Этот метод позволяет мне вызывать методы следующим образом: A.__exec('methA', arguments); Это почти то, что я хочу, но довольно уродливо. Я бы предпочел A.test.methA(), где test никогда не будет использоваться в рабочем коде - только для раскрытия частных методов.


РЕДАКТИРОВАНИЕ Я вижу людей, которые советуют мне тестировать что-то большое, а не мелкие детали. Позволь мне объяснить. На мой взгляд, API должен раскрывать только нужные методы, а не набор внутренних функций. Внутренности из-за их небольшого размера и ограниченной функциональности гораздо проще протестировать, чем протестировать все это целиком и угадать, какая часть пошла не так.

Хотя я могу ошибаться, я все же хотел бы посмотреть, как я могу вернуть ссылки на все методы из самого объекта :).


  • вы не тестируете частные методы или не делаете их частными. это просто. 18.03.2013
  • Частные методы @mpm тоже являются кодом, поэтому их тоже нужно тестировать. 18.03.2013
  • Это не очень хорошая идея. Частные методы являются частными, вам не нужно делать их общедоступными. Протестируйте свои публичные методы, они зависят от приватных, поэтому тестирование публичных также должно охватывать это. 18.03.2013
  • возможный дубликат Как выполнить модульное тестирование "частной" функции утилиты в nodejs 18.03.2013
  • @lukas.pukenis, тогда опубликуй, что в этом сложного? вы хотите получить доступ к чему-то, сделайте это общедоступным. Вы не хотите, тогда сделайте это частным. Вы можете использовать композицию, чтобы сделать что-то общедоступным внутри другого объекта. Я не понимаю, в чем здесь проблема. Вы просто не можете иметь и то, и другое, вот и все. И, как указано в другом вопросе (верхнем), TDD касается тестирования контрактов. TDD не заботится о частном. 18.03.2013
  • @mpm, проблема в том, что я унаследовал очень большую кодовую базу и просто хочу свести к минимуму свои усилия :) Я не вижу проблем в том, чтобы раскрыть функции как общедоступные, но это потребует много ручной работы. 18.03.2013

Ответы:


1

Ответьте на свой первый вопрос (вы возвращаете это, но оно возвращает окно, а не объект, который вы хотели): в javascript this внутри функция возвращает глобальный объект, если эта функция не является методом объекта.

Рассмотрим следующие примеры:

1) this указывает на глобальный объект():

function(){
   return this;
}

2) this указывает на объект:

var obj = {
    value: "foo",
    getThisObject: function(){
        return this;
    }
}

Ваш случай — это пример №1, потому что у вас есть функция, которая возвращает объект. Эта функция не является методом какого-либо объекта.

Лучший ответ на ваш второй вопрос — тестировать только общедоступные методы, но если это так важно для вас, я могу предложить следующее:

создавайте свои модули динамически на стороне сервера.

Как это работает:

  • создайте отдельные скрипты для нужной вам функциональности;
  • создавать тесты для этих отдельных скриптов;
  • создайте метод, который будет объединять скрипты в один, как вы хотите;
  • чтобы загрузить скрипт, обратитесь к методу объединения скриптов.

Надеюсь, это может решить вашу проблему. Удачи!

07.06.2013

2

Почему бы не использовать пространства имен для добавления своих модулей и общедоступных методов в js-движок. Как это:

window['MyApp']['MODULE1'] = { "METHOD1" : {}, "METHOD2" : {}}; 

Я пишу такие модули, как этот пример модуля на JavaScript.

И проверьте это следующим образом: Простое модульное тестирование в JavaScript

Использование eval(), как правило, не очень хорошая идея.

18.03.2013
  • Возможно, вы правы насчет eval(), но я не вижу в этом проблемы. Это языковая конструкция, которая помогает в определенных случаях. 19.03.2013
  • Новые материалы

    Освоение информационного поиска: создание интеллектуальных поисковых систем (глава 1)
    Глава 1. Поиск по ключевым словам: основы информационного поиска Справочная глава: «Оценка моделей поиска информации: подробное руководство по показателям производительности » Глава 1: «Поиск..

    Фишинг — Упаковано и зашифровано
    Будучи старшим ИТ-специалистом в небольшой фирме, я могу делать много разных вещей. Одна из этих вещей: специалист по кибербезопасности. Мне нравится это делать, потому что в настоящее время я..

    ВЫ РЕГРЕСС ЭТО?
    Чтобы понять, когда использовать регрессионный анализ, мы должны сначала понять, что именно он делает. Вот простой ответ, который появляется, когда вы используете Google: Регрессионный..

    Не зря же это называют интеллектом
    Стек — C#, Oracle Опыт — 4 года Работа — Разведывательный корпус Мне пора служить Может быть, я немного приукрашиваю себя, но там, где я живу, есть обязательная военная служба на 3..

    LeetCode Проблема 41. Первый пропущенный положительный результат
    LeetCode Проблема 41. Первый пропущенный положительный результат Учитывая несортированный массив целых чисел, найдите наименьшее пропущенное положительное целое число. Пример 1: Input:..

    Расистский и сексистский робот, обученный в Интернете
    Его ИИ основан на предвзятых данных, которые создают предрассудки. Он словно переходит из одного эпизода в другой из серии Черное зеркало , а вместо этого представляет собой хронику..

    Управление состоянием в микрофронтендах
    Стратегии бесперебойного сотрудничества Микро-фронтенды — это быстро растущая тенденция в сфере фронтенда, гарантирующая, что удовольствие не ограничивается исключительно бэкэнд-системами..