2015-07-14 3 views
0

Я пытаюсь использовать библиотеку Python mock для моделирования нескольких методов для zipfile-модуля.Mocking zipfile in python

Пример Источник, который я хочу, чтобы тест:

def zipStuff(listOfPathToFiles): 
    with ZipFile(fName, 'w') as archive: 
     for each in listOfPathToFiles: 
      archive.write(each, strippedfName) 
    return archive 

«архив» выше будет игнорироваться для нормального исполнения, но будет список файлов во время тестов.

Пример UnitTest Код:

emptyList=[] 

def mockWrite(fName): 
    emptyList.append(fName) 
    return 

mockZip.__enter__ = Mock(return_value=emptyList) 
mockZip.__exit__ = Mock(return_value=True) 

Теперь я хочу, чтобы дразнить archive.write так, что вместо фактического вызова записи, он заменяется функцией mockWrite таким образом я могу получить список всех файлов, которые должны были для молнии.

Я пробовал:

mockZip.write = Mock(side_effect=mockWrite) 

, но это не называют. Отладка показывает, что функция вызывает mockZip. введите() .write. Если я попробую:

mockZip.__enter__().write = Mock(side_effect=mockWrite) 

Python выдает ошибку, в которой «список» не имеет атрибута write (что правильно). Я новичок в Mock и Python и очень ценю любые указатели. Предложения?

+0

'mockZip .__ enter__ = (return_value = emptyList)' invalid syntax – LittleQ

+0

Я написал код здесь и снова пропустил Mock-вызовы. Правильный синтаксис - Mock (return_value = emptyList). Изменен исходный вопрос. Спасибо :) – user2148703

ответ

2

Вместо mockZip.__enter__ возвращает пустой список, которые он возвращает объект, как следующее:

class MockZipFile: 
    def __init__(self): 
     self.files = [] 
    def __iter__(self): 
     return iter(self.files) 
    def write(self, fname): 
     self.files.append(fname) 

Вы можете добавлять методы и реализацию по мере необходимости для удовлетворения ваших потребностей насмешливых.

+0

Спасибо! Я использую это сейчас! – user2148703

0

Я считаю, что ваша проблема в том, что функция называется введите с помощью contextlib (https://docs.python.org/2/library/contextlib.html), а не записи. Изменение этого макета должно решить вашу проблему.

+0

К сожалению, я хотел написать __enter__, а не __entry__. Я отредактировал сообщение, чтобы это отразить. – user2148703