为什么我在端点后测试、单元测试期间得到422状态代码



在应用程序的运行测试用例中,即使数据格式正确,我也会不断看到测试失败。以下是我的代码片段:

我可以通过它的应用程序界面创建一个新用户,但尝试它的行为,它给了我一个意外的错误状态代码422。我真的不知道这些片段出了什么问题。在这里,我包含了以下所有代码,以便更好地了解所述问题。

对于端点/users

@app.route('/users/, methods=['POST'])
def create_user():
try:
body = request.get_json((
new_user = body get('user_name', None)
if user_name is None:
about(405)
new_entry = User(new_user)
new_entry.insert()
return jsonify({
'success': True
)}
except:
abort(422)

这是我的型号类别:

class User(db.Model):
__tablename__='users'
id = Column(Integer, primary_key=True)
name = Column(String, nullable=False)
score = Column(Integer, nullable=False)
def __init__(self, name, score=0):
self.name = name
self.score = score
def insert(self):
db.session.add(self)
db.session.commit()
def format(self):
return {
'id': self.id,
'name': self.name,
'score': self.score

这是我的test_case_file:

class TriviaTestCase(unit test.TestCase):
def setUp(self):
self.app = create_app()
self.client = self.app.test_client
self.database_path = "PostgreSQL://postgres:postgresspass@localhos:5432/user_test_db"
setup_db(self.app, self database_path)
self.new_user = {
"username":"P.Son",
"score": 0
}
def test_create_user(self):
res = self.client().post("/users", json=self.new_user)
data = json.loads(res.data)


self.assertEqual(res.status_code, 200)

self.assertEqual(data['success'], True)
if __name__=="__main__":
unittest.main()

我的测试输出:

============================
FAIL: test_create_user (__main__.TriviaTestCase)
----------------------------
Traceback (most recent call last):
File "C:...test_flaskr.py", line 201, in test_create_user
self.assertEqual(res.status_code, 200)
AssertionError: 422 != 200

注意其他端点通过了测试,但上述端点一直未通过测试。我不知道我写的片段出了什么问题。

首先,当这些错误发生在端点中时,您应该始终记录它们。第二,在"的情况下,您自己返回422错误;任何";异常,并且您的代码中存在一些异常。其中之一是,您只是将user_name传递给User类的构造函数,但也必须存在score变量。另一个问题是,应该将键值参数传递给User类构造函数,而不是字典。应该是这样的:

body = request.get_json()
user_name = body.get('user_name', '')
score = body.get('score', '')
if not all([user_name, score]):
# return some customized error here
new_entry = User(user_name=user_name, score=score)

此外,您应该考虑某种形式的输入验证,而不仅仅是自己检查数据。像Marshmelow这样的东西就可以了。

最新更新