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

1

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

这些框架使编写测试类中每个方法的测试变得容易,并根据需要提供适当的测试脚手架和测试数据。恕我直言,比尝试手工测试要容易得多。

于 2013-07-30T19:23:12.110 回答
0

下面的 mock 补丁可以跳过init部分(其实我不知道你为什么在这里避免“mock the init method”,所以在这里粘贴我的猜测):

#!/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 回答