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