1

モックを使用してテストしたいインスタンス メソッドがあります。このインスタンス クラスのメソッドの 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'))

しかし、それはうまくいきませんでした。次に、ファイル名をグローバル変数として作成しようとしましたが、次のエラーが発生しました。

ClassToTest インスタンスに self.filename が存在しません。

基本的に、_get_fake_xml を他のファイル名で再利用できるようにしたいと考えています。

なにか提案を?

4

2 に答える 2

2

それで、いくつか考えた後、私はモック.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()

パッチデコレータに引数を追加する方法があるのではないかと思います。

于 2012-12-03T15:15:53.313 に答える
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()
于 2012-10-26T17:29:21.500 に答える