使用python中的参数使用另一个可重用的方法来模拟一个方法

时间:2012-10-26 15:43:36

标签: python django mocking

我有一个我想用mock测试的实例方法。我试图用另一个带参数的方法替换此实例类中的一个方法。

要测试的课程:

class ClassToTest():
    def compute(self):
        result = self._get_xml()
        return result

    def _get_xml(self):
        #get xml here
        return xml    

测试文件:

from mock import patch
class ClassTest():

    @patch('classToTest._get_xml', _get_fake_xml)
    def computetest(self):
        test = ClassToTest()
        toassert = test.compute()

        #assert whatever
        #self.assert(...)

    def _get_fake_xml(self, objects, filename):
        py_file = os.path.abspath(__file__)
        py_dir = os.path.dirname(py_file)
        xml_file = os.path.join(py_dir, filename)
        xml_tree = objectify.parse(xml_file)
        return xml_tree.getroot()
        return xml 

现在如何在补丁

中添加_get_fake_xml方法的参数

我试过了:

@patch('classToTest._get_xml', _get_fake_xml(mock.Mock(), 'filenam.xml'))

但那没用。然后我尝试将filename作为全局变量,但是我收到以下错误:

ClassToTest实例中不存在self.filename。

基本上我希望能够将_get_fake_xml重用于任何其他文件名。

有什么建议吗?

2 个答案:

答案 0 :(得分:2)

所以,经过一番思考后,我决定使用mock .return_value。

@patch('classToTest._get_xml')
    def computetest(self, get_xml):
        get_xml.return_value = _get_fake_xml('filenam.xml')
        test = ClassToTest()
        toassert = test.compute()

我想知道是否有办法在补丁装饰器中添加参数。

答案 1 :(得分:0)

你能把它放在封口吗?您可以从仍然可以访问_get_fake_xml范围的_get_fake_xml方法返回一个函数,如下所示:

from mock import patch
class ClassTest():

    @patch('classToTest._get_xml', _get_fake_xml(mock.Mock(), 'filenam.xml'))
    def computetest(self):
        test = ClassToTest()
        toassert = test.compute()

        #assert whatever
        #self.assert(...)

    def _get_fake_xml(self, objects, filename):
        py_file = os.path.abspath(__file__)
        py_dir = os.path.dirname(py_file)
        xml_file = os.path.join(py_dir, filename)
        xml_tree = objectify.parse(xml_file)
        # don't know much about mock, but I include *a in case this is passed self
        return lambda *a: xml_tree.getroot()