Python 如何从E11000 ReplicationKeyError获取消息?
因此,我正在为一个项目编写单元测试,并且正在测试Python 如何从E11000 ReplicationKeyError获取消息?,python,python-3.x,mongodb,flask,pymongo,Python,Python 3.x,Mongodb,Flask,Pymongo,因此,我正在为一个项目编写单元测试,并且正在测试register()函数 这是: def register(): # Get information about user username = request.get_json().get("username") password = request.get_json().get("password") name = request.get_json().get("name") email = reques
register()
函数
这是:
def register():
# Get information about user
username = request.get_json().get("username")
password = request.get_json().get("password")
name = request.get_json().get("name")
email = request.get_json().get("email")
# Put information about user in a tuple
values = (
None,
username,
User.hash_password(password),
name,
email,
None
)
try:
# Create user and update session
User(*values).create()
ActiveUser.logged_in = True
ActiveUser.username = username
info_log.info("User %s registered successfully." % username)
return jsonify(success=True, message="Registration successful!")
except pymongo.errors.DuplicateKeyError as e:
# Catch pymongo exception
return jsonify(success=False, message="Duplicated username or email!"), 403
我想有三个测试:有效,无效(重复用户名),无效(重复电子邮件)
正如预期的那样,我得到了DuplicateKeyError,因为我在数据库中为这些参数设置了Unique
pymongo.errors.DuplicateKeyError: E11000 duplicate key error collection: user.users index: username_1 dup key: { username: "test" }
有没有办法从DuplicateKeyError中获取哪个是重复项,这样我就可以对重复的用户名和电子邮件进行单独的单元测试
我知道这更多的是一种组件/集成测试,而不是单元测试,但这是我知道如何在Python3中进行测试的唯一方法
因此,我开始深入研究DuplicateKeyError的实现,发现它包含
code
和details
我打印了错误的详细信息
,得到了以下信息:
{
"message": {
"code": 11000,
"errmsg": "E11000 duplicate key error collection: user.users index: username_1 dup key: {
username: \"test\"
}",
"index": 0,
"keyPattern": {
"username": 1
},
"keyValue": {
"username": "test"
}
},
"success": false
}
在那之后,很容易让这两个测试开始工作
try:
# code
except pymongo.errors.DuplicateKeyError as e:
# Catch pymongo exception
key = list(e.details.get("keyValue").keys())[0]
value = e.details.get("keyValue").get(key)
return jsonify(success=False, message="Duplicate %s: %s" % (key, value)), 403
以及测试:
def test_03_invalid_user_registration_duplicate_username(self):
response = self.register("test", "12345678", "Tester 2", "test1@mail.mail")
self.assertEqual(response.status_code, 403)
self.assertIn(b"Duplicate username: test", response.data)
def test_04_invalid_user_registration_duplicate_email(self):
response = self.register("test", "12345678", "Tester 3", "test@mail.mail")
self.assertEqual(response.status_code, 403)
self.assertIn(b"Duplicate email: test@mail.mail", response.data)
def test_03_invalid_user_registration_duplicate_username(self):
response = self.register("test", "12345678", "Tester 2", "test1@mail.mail")
self.assertEqual(response.status_code, 403)
self.assertIn(b"Duplicate username: test", response.data)
def test_04_invalid_user_registration_duplicate_email(self):
response = self.register("test", "12345678", "Tester 3", "test@mail.mail")
self.assertEqual(response.status_code, 403)
self.assertIn(b"Duplicate email: test@mail.mail", response.data)