测试使用sqlite数据库的FlaskAPI

2024-03-29 11:43:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在为一个flaskapi编写一个测试,用户可以在其中创建一个帐户。在运行测试(unittest)之后,我不断得到这个错误。有没有更好的方法来测试API ie,我也可以用它来测试GET、PUT和DELETE请求?你知道吗

类型错误:自我评价(结果[“id”],“4”) “method”对象不可下标

这是我的数据库设置:

    class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    public_id = db.Column(db.String(50), unique = True)
    name = db.Column(db.String(50))
    password = db.Column(db.String(80))
    admin = db.Column(db.Boolean)

我要测试的API:

@APP.route('/user', methods = ['POST'])
def create_user():

    data = request.get_json(force = True)
    hashedpassword = generate_password_hash(data['password'], method= 'sha256')
    new_user = User(public_id = str(uuid.uuid4), name = data['name'], password = hashedpassword, admin = False)

    db.session.add(new_user)
    db.session.commit()

我的测试:

class testMainmodule(unittest.TestCase):

    def setUp(self):
        APP.testing = True
        self.app = APP.test_client()
        self.data = {"admin": False,
                "id": "4",
                "name": "njati",
                "password": "sha256$xfIUTEIX$6973717971585c3b7ebb593876def4124ff3eb4f8e30c3b43e2c8af20fe64952",
                "public_id": "<function uuid4 at 0x7fb631f93d08>"}

    def post_create_user(self, data = {}):
        if not data:
            data = self.data
        result= self.app.post(path = "/user", data = json.dumps(self.data), content_type = "application/json")
        json_response = json.loads(result.get_data(as_text=True))
        return jsonify(json_response)

    def test_create_user(self):
        result = self.post_create_user

        self.assertEqual(result["id"], "4")
        self.assertEqual(result["public_id"], "<function uuid4 at 0x7fb631f93d08>")
        self.assertTrue(result["admin"], False)
        self.assertEqual(result["name"], "njati")
        self.assertEqual(result["password"], "sha256$xfIUTEIX$6973717971585c3b7ebb593876def4124ff3eb4f8e30c3b43e2c8af20fe64952")
        self.assertEqual(response.status_code, 201)

Tags: nameselfidjsontruedbdataadmin
2条回答

您的代码没有调用create\u user,它指向create\u user方法。 这就是为什么你会

TypeError: self.assertEqual(result["id"], "4") 'method' object is not subscriptable

试试看

result = self.post_create_user()
self.assertDictEqual(result,self.data)
# You will face an issue with the line below since response is not defined
self.assertEqual(response.status_code, 201)

不是

result = self.post_create_user

也许这是对@balderman已经给出的答案的进一步阐述,但原因如下:

result["id"]

result是一个包含类方法的变量,方法不是这样使用的。你知道吗

声明result = self.post_create_user时,python假定post\u create\u user是一个不能用参数调用的属性。但既然这是一种方法,你就应该使用self.post\创建\用户()相反,当您将它作为参数传递时(不带括号),您应该提供第二个参数作为它的参数(参见上面balderman的回答)

相关问题 更多 >