Как макетировать объекты с конструкторами в Python3? - PullRequest
1 голос
/ 15 августа 2011

Я новичок в Python (я из Java) и столкнулся с проблемой использования mocks в Python3.2.

Вот код:

import gzip    

class MyClass:

    _content = None

    _gzipfile = gzip.GzipFile

    def __init__(self, content):
        self._content = content

    def my_method(self):
        # Code ...
        gzipper = self._gzipfile(fileobj=data)
        return gzipper.read()


import unittest
from mockito import *

class MyClassTest(unittest.TestCase):

    def my_method_test(self):
        gzipfile = mock
        myclass = MyClass()
        myclass._gzipfile = mock
        myclass.my_method

Я хотел бы провести модульное тестирование моего метода (я использую mockito lib для макетов). Но когда я выполняю тест, я получаю это:

TypeError: __init__() got an unexpected keyword argument 'fileobj'

В этом случае я вынужден вызывать объект GzipFile с именованным параметром.

Есть ли хороший способ издеваться над этим объектом GzipFile (и похожими)?

1 Ответ

0 голосов
/ 17 октября 2015

TypeError, который вы видите, вызван тем, что вы присваиваете myclass._gzipfile объекту класса mockito.mock.Поэтому, когда my_method вызывает _gzipfile с ключевым аргументом fileobj=data, он фактически вызывает класс mockito.mock и, таким образом, вызывает его метод __init__, который не понимает этот аргумент.

Что-то вроде этогодолжно сработать.Это все еще не идеальный модульный тест, поскольку он зависит от gzip.GzipFile, но он должен помочь вам начать работу.

import gzip

class MyClass(object):
    def __init__(self, content, file):
        self._content = content
        self._gzipper = gzip.GzipFile(filename=file)
    def my_method(self):
        # Code ...
        return self._gzipper.read()

import unittest
from mockito import *

class TestMyClass(unittest.TestCase):
    def setUp(self):
        self.my_class = MyClass('some content', 'file')

    def test_my_method(self):
    self.my_class._gzipper = mock()
        when(self.my_class._gzipper).read().thenReturn('gzipper read return')
        data = self.my_class.my_method()
        self.assertEqual(data, 'gzipper read return')

if __name__ == '__main__':
    unittest.main()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...