staticmethod装饰器的问题

时间:2013-07-30 14:30:19

标签: python unit-testing mocking static-methods

我一直在我的一些函数上使用@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')

2 个答案:

答案 0 :(得分:1)

我建议您使用Python的一个可用测试框架,例如:

这些框架可以轻松编写在类中执行每个方法的测试,并根据需要提供适当的测试脚手架和测试数据。恕我直言,比试图手工测试更容易。

答案 1 :(得分: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__)