2012-10-26 3 views
1

모의 메소드를 사용하여 테스트하고 싶은 인스턴스 메소드가 있습니다. 이 인스턴스 클래스의 메서드 중 하나를 인수를 사용하는 다른 메서드로 대체하려고합니다.파이썬에서 인자를 가진 재사용 가능한 다른 메소드로 메소드 조롱

클래스는 테스트 할 수 있습니다 :

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 함수와 쌍을 이루는 범위입니다. Wikipedia에 대한 자세한 내용 : http://en.wikipedia.org/wiki/Closure_(computer_science). 첫 번째 예제는 위에 사용 된 것과 비슷한 파이썬 하나입니다. – dokkaebi

+0

고마워, 그래도 고쳐주지 않았다. – momigi

관련 문제