Python, поблочное тестирование и дразнящий импорт

jsfiddle

Предположим, у вас есть HTML, похожий на этот:

Lorem Ipsum 1

Lorem Ipsum 2

Lorem Ipsum 3

Lorem Ipsum 4

Вы можете сделать что-то вроде:

let divCol = document.getElementsByClassName('test');
let arr = Array.prototype.slice.call(divCol);

for (let i = 0; i < arr.length; i++) {
    console.log(arr[i].firstChild.textContent);
}

Таргетинг сначала дочерний элемент в каждом элементе div, который будет абзацем, а затем захватывает textContent этого текста абзаца.

Вывод на консоль:

Lorem Ipsum 1
Lorem Ipsum 2
Lorem Ipsum 3
Lorem Ipsum 4

Получить текст абзаца внутри элемента
nodeValue против innerHTML и textContent. Как выбрать?

12
задан CharlesB 25 February 2013 в 15:21
поделиться

5 ответов

Если Вы хотите импортировать модуль, одновременно удостоверяясь, что он ничего не импортирует, можно заменить __import__ встроенная функция.

Например, используйте этот класс:

class ImportWrapper(object):
    def __init__(self, real_import):
        self.real_import = real_import

    def wrapper(self, wantedModules):
        def inner(moduleName, *args, **kwargs):
            if moduleName in wantedModules:
                print "IMPORTING MODULE", moduleName
                self.real_import(*args, **kwargs)
            else:
                print "NOT IMPORTING MODULE", moduleName
        return inner

    def mock_import(self, moduleName, wantedModules):
        __builtins__.__import__ = self.wrapper(wantedModules)
        try:
            __import__(moduleName, globals(), locals(), [], -1)
        finally:
            __builtins__.__import__ = self.real_import

И в Вашем тестовом коде, вместо записи import myModule, запись:

wrapper = ImportWrapper(__import__)
wrapper.mock_import('myModule', [])

Второй аргумент mock_import список имен модуля, которые Вы действительно хотите импортировать во внутреннем модуле.

Этот пример может быть изменен далее к, например, импортировать другой модуль, чем желаемый вместо того, чтобы просто не импортировать его или даже дразнить объект модуля с некоторым собственным пользовательским объектом.

7
ответ дан 2 December 2019 в 22:39
поделиться

Если Вы действительно хотите слоняться без дела с механизмом импорта Python, смотреть на ihooks модуль. Это обеспечивает инструменты для изменения поведения __import__ встроенный. Но не ясно из Вашего вопроса, почему необходимо сделать это.

1
ответ дан 2 December 2019 в 22:39
поделиться

"импорт много других файлов"? Импорт много других файлов, которые являются частью Вашей специализированной кодовой базы? Или импорт много других файлов, которые являются частью распределения Python? Или импорт много других файлов проекта с открытым исходным кодом?

Если Ваш импорт не работает, у Вас есть "простое" PYTHONPATH проблема. Получите все свои различные каталоги проекта на a PYTHONPATH то, что можно использовать для тестирования. У нас есть довольно сложный контур, в Windows мы управляем им как это

@set Part1=c:\blah\blah\blah
@set Part2=c:\some\other\path
@set that=g:\shared\stuff
set PYTHONPATH=%part1%;%part2%;%that%

Мы разделяем каждую часть пути так, чтобы мы (a) знаем, куда вещи прибывают из и (b) можем управлять изменением, когда мы перемещаем вещи.

Начиная с PYTHONPATH ищется в порядке, мы можем управлять тем, что привыкает путем корректировки порядка на путь.

После того как у Вас есть "все", это становится вопросом доверия.

Также

  • Вы доверяете чему-то (т.е. кодовая база Python) и просто импортируете ее.

Или

  • Вы не доверяете чему-то (т.е. Ваш собственный код) и Вы

    1. протестируйте его отдельно и
    2. дразните его за автономное тестирование.

Вы протестировали бы библиотеки Python? Если так, у Вас есть большая работа. В противном случае затем необходимо, возможно, только дразнить вещи, которые Вы на самом деле собираетесь протестировать.

1
ответ дан 2 December 2019 в 22:39
поделиться

В Вашем комментарии выше, Вы говорите, что хотите убедить Python, что определенные модули были уже импортированы. Это все еще походит на странную цель, но если это действительно, что Вы хотите сделать, в принципе можно красться вокруг за спиной механизма импорта и изменением sys.modules. Не уверенный, как это работало бы на импорт пакета, но должно быть хорошо для абсолютного импорта.

0
ответ дан 2 December 2019 в 22:39
поделиться

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

Если модульные тесты находятся в том же файле как код, Вы хотите протестировать, просто удалить нежелательный модуль из globals() словарь.

Вот довольно долгий пример: предположите, что у Вас есть модуль impp.py с содержанием:

value = 5

Теперь, в Вашем тестовом файле можно записать:

>>> import impp
>>> print globals().keys()
>>> def printVal():
>>>     print impp.value
['printVal', '__builtins__', '__file__', 'impp', '__name__', '__doc__']

Отметьте это impp среди globals, потому что он был импортирован. Вызывание функции printVal это использует impp модуль все еще работает:

>>> printVal()
5

Но теперь, если Вы удаляете impp ключ от globals()...

>>> del globals()['impp']
>>> print globals().keys()
['printVal', '__builtins__', '__file__', '__name__', '__doc__']

... и попытайтесь звонить printVal(), Вы доберетесь:

>>> printVal()
Traceback (most recent call last):
  File "test_imp.py", line 13, in <module>
    printVal()
  File "test_imp.py", line 5, in printVal
    print impp.value
NameError: global name 'impp' is not defined

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

Для использования его в модульных тестах можно удалить globals прежде, чем выполнить набор тестов, например, в __main__:

if __name__ == '__main__':
    del globals()['impp']
    unittest.main()
0
ответ дан 2 December 2019 в 22:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: