【问题标题】:Test a Flask API that uses sqlite database测试一个使用 sqlite 数据库的 Flask API
【发布时间】:2019-04-07 12:00:22
【问题描述】:

我正在为用户可以创建帐户的烧瓶 API 编写测试。运行测试(单元测试)后,我不断收到此错误。是否有更好的方法来测试该 API,即我也可以使用它来测试 GET、PUT 和 DELETE 请求?

TypeError: self.assertEqual(result["id"], "4") “方法”对象不可下标

这是我的数据库设置:

    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)

【问题讨论】:

    标签: python unit-testing flask


    【解决方案1】:

    您的代码没有调用 create_user,它指向方法 create_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
    

    【讨论】:

    • 我确实做到了,但得到了一个不同的错误:RuntimeError:在应用程序上下文之外工作。这通常意味着您尝试使用需要以某种方式与当前应用程序对象交互的功能。要解决此问题,请使用 app.app_context() 设置应用程序上下文。有关详细信息,请参阅文档。
    • @Willie Njati。这是一个不同的话题。如果你的单元测试代码开始工作,你最好关闭这篇文章并创建一个新的来处理你面临的 Flask 问题。添加 Flask 堆栈跟踪。
    【解决方案2】:

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

    result["id"]
    

    result 是一个保存类方法的变量,方法不是这样使用的。

    当您声明 result = self.post_create_user 时,python 假定 post_create_user 是一个不可使用参数调用的属性。但是由于它是一种方法,因此您应该改用 self.post_create_user() ,并且当您将其作为参数(不带括号)传递时,您应该提供第二个参数作为其参数(参见上面 balderman 的回答)

    【讨论】:

      猜你喜欢
      • 2021-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-13
      • 2021-08-06
      • 2018-09-15
      • 1970-01-01
      相关资源
      最近更新 更多