0

@staticmethodテストケースを書くために、いくつかの関数でデコレータを使用しています。クラス全体を初期化することなく、クラス内のいくつかのメソッドをテストしたかっただけなので、これは完璧な方法だと思いました。

しかし、テストコードは正常に実行されますが、実際のコードではエラーが発生します。ほとんどの関数にはselfパラメーターが渡されているため、@staticmethodデコレーターは失敗します。

を使用せずにメソッドをテストする方法はあり@staticmethodますか? そうでない場合、本番コードをあまり変更せずにこれを回避する完璧な方法は何でしょうか?

Class DBMethod():
      @staticmethod
      def getVN(self, tN):
          curs = self.connection.cursor()
          curs.execute ('SELECT * FROM ' + tN)
          vL = list(map(lambda x: x[0], curs.description))[0]
          return vL

そしてテストクラス

Class DBTestClass(unittest.TestCase):
      def test_getVN(self):
            self.assertEqual(DBMethod.getVN(self, 'tbN'), 'VER')
4

2 に答える 2

0

次のモック パッチでは、 init部分をスキップできます(実際には、ここで「init メソッドのモック」を避ける理由がわからないので、ここに私の推測を貼り付けます)。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
import unittest
from mock import patch


class DBThing(object):
    moo = "bar"

    def __init__(self):
        self.moo = "hi"

    def foo(self):
        return self.moo

class Test_init(unittest.TestCase):
    """Test DBThing init"""
    def setUp(self):
        pass

    def tearDown(self):
        pass

    def testInit(self):
        dbt = DBThing()
        self.assertEqual(dbt.foo(), "hi")

    def testNoInit(self):
        with patch('__main__.DBThing.__init__', return_value=None):
            dbt = DBThing()
            self.assertEqual(dbt.foo(), "bar")

if __name__ == '__main__':
    import nose
    nose.run(defaultTest=__name__)
于 2013-07-31T01:37:02.720 に答える