NameError:全局名称'客户端'没有定义

时间:2014-09-10 09:37:42

标签: python

这里我做了连接mongo的python类并从mongo数据库中获取数据并处理它我为此做了单元测试用例我得到了以下错误

NameError:未定义全局名称“client”

python class:

 from pymongo.errors import ConnectionFailure, AutoReconnect
 import pymongo
 from pymongo import MongoClient

 class ConnectionError(Exception):
   pass



class ChkMongo:

item_list=[]
dict1={}

def makeMongocon(self):

    global client
    try :
        client = MongoClient("localhost", 27017)

    except AutoReconnect, e:
        raise ConnectionFailure(str(e))

def findRecords(self):
    self.db = client.serv
    for item in self.db.serv.find():
        self.item_list.insert(0,item)
    return self.item_list





if __name__ == '__main__':
  c=ChkMongo()
  c.makeMongocon()
  print(c.findRecords())

我的单元测试用例

from pymongo.errors import ConnectionFailure
 import unittest;
 from app.ChkMongo import *  

class TestChkMongo(unittest.TestCase):

def setUp(self):
    self.c=ChkMongo()

def test_makeMongocon(self):
    self.assertRaises(ConnectionFailure,self.c.makeMongocon)
def test_findRecords(self):
    print(self.c.findRecords())
    self.assertDictContainsSubset({'name':'matthew'},self.c.findRecords())
def test_calculate_charge_with_tax(self):
    self.assertAlmostEqual(290,self.c.calculate_charge_with_tax('matthew'))


if __name__ == '__main__':
  unittest.main()

我在运行测试用例时遇到以下错误,但运行了可以正常工作的python脚本

错误:

Traceback (most recent call last):
  File "/test/test_chkMongo.py", line 16, in test_findRecords
    print(self.c.findRecords())
  File "n/app/ChkMongo.py", line 29, in findRecords
    self.db = client.serventer code here
NameError: global name 'client' is not defined

2 个答案:

答案 0 :(得分:1)

对我来说,这是在使用Python 3.6.x 和Python 2.x 运行测试时发生的。 某些异常名称在Python 2.x 中不可用。

例如使用ConnectionError

在Python 2.x 中,使用python解释器,我得到了NameError,因为它无法识别。

>>> raise ConnectionError
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'ConnectionError' is not defined

在Python 3.6.x 中,使用python3解释器,我得到了正确的ConnectionError

>>> raise ConnectionError
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ConnectionError

在使用多个版本的Python或不同的venv时可能会很棘手。希望对调试有所帮助。

答案 1 :(得分:0)

我不知道为什么你在client使用全局变量。那应该是ChkMongo类的实例变量。

class ChkMongo:
  def __init__(self):
    self.item_list = []
    self.dict1 = {}

  def makeMongocon(self):
    try:
        self.client = MongoClient("localhost", 27017)
    except AutoReconnect, e:
        raise ConnectionFailure(str(e))

  def findRecords(self):
    self.db = self.client.serv
    for item in self.db.serv.find():
        self.item_list.insert(0,item)
    return self.item_list

请注意,item_listdict1也需要是实例属性,而不是类属性。