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)