【发布时间】:2021-09-25 13:33:48
【问题描述】:
我一直在学习有关单元测试烧瓶应用程序的 Udacity 课程。
所需的所有文件都在这个Github link 中,我们将只关注“后端”目录。这个目录包含flaskr目录和两个文件——其中一个是test_flaskr.py,我正在尝试修复这个test_delete_book方法。
目前这个test_delete_book 测试方法的编码方式它只会通过第一个测试(并且将在后续测试中失败)。所以我想要做的是获取最后一个 Book 条目的 'id' 键的值,并将其传递给 delete book API 。在同一个测试文件test_flaskr.py 中还有另一个test_create_new_book 方法可确保Book 表永远不会耗尽数据(因此test_delete_book 在我的代码更改后永远不会失败。
顺便说一下,这里是 Book 表结构的link。
这是我的 test_delete_book 代码(仅强调两行 - 第 03 行和第 04 行):
01 # Delete a different book in each attempt
02 def test_delete_book(self):
03 book = Book.query.order_by(Book.id.desc()).first()
04 book_id_to_delete = book.id
05 # res = self.client().delete('/books/<book_id_to_delete')
06 res = self.client().delete('/books/' + str(book_id_to_delete))
07 data = json.loads(res.data)
80
09 book = Book.query.filter(Book.id == book_id_to_delete).one_or_none()
10
11 self.assertEqual(res.status_code, 200)
12 self.assertEqual(data['success'], True)
13 self.assertEqual(data['deleted'], book_id_to_delete)
14 self.assertTrue(data['total_books'])
15 self.assertTrue(len(data['books']))
16 self.assertEqual(book, None)
在第 03 行,我编写了 SQLAlchemy 查询以获取最后一个 Book 表条目的 book.id 值,并将最后一个 book id 值保存在 book_id_to_delete 变量中。顺便说一句,这个测试实际上与数据库接口(未模拟)。在我运行测试之前,我注意到最后一个 Book 表条目的“id”键。当我运行测试时,所有测试都通过了,但最后一个表条目仍在表中。另外,我没有看到应该由我之前提到的test_create_new_book 方法创建的新记录。
这就是奇怪的地方(至少对我来说):
当我通过将“book.id”替换为 Book 表中最后一个条目的实际图书 id 值来修改第 04 行时,然后运行测试,不仅最后一个条目从 Book 表中删除,而且我还可以看到test_create_new_book方法创建的新书表记录。
非常感谢任何有用的意见。
【问题讨论】:
标签: python api flask python-unittest