如何在Python3中使用构造函数模拟对象?

时间:2011-08-15 00:59:19

标签: python unit-testing testing python-3.x mocking

我是Python的新手(我来自Java),我在使用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 :(得分:0)

您看到的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()