2012-10-26 18 views
1

我有一个我想用mock测试的实例方法。我试图用另一个带参数的方法来替换这个实例类中的一个方法。用python中的参数模拟另一种可重复使用的方法

类是测试:

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')) 

但这并没有奏效。然后我尝试将文件名作为全局变量,但出现以下错误:

self.filename在ClassToTest实例中不存在。

基本上我想能够重用_get_fake_xml与任何其他文件名。

有什么建议吗?

回答

2

于是,经过一番思考,我决定用模拟.return_value:你可以从你的_get_fake_xml方法仍然可以访问_get_fake_xml的范围这样的返回功能。

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

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

0

你能把它放在封口处吗?

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() 
+0

什么是封闭? – momigi

+0

@AndyR它是一个与函数配对的范围。更多关于维基百科:http://en.wikipedia.org/wiki/Closure_(computer_science)。第一个例子有一个类似于我上面使用的Python。 – dokkaebi

+0

我看到谢谢,但它并没有解决它 – momigi

相关问题