7.1
坑9:最后修改功能测试时输入'testing\n',但其实inputbox并没有声明,而是直接使用了。声明inputbox后发现测试仍然能通过,因为\n实际上并没有触发输入框的POST请求事件,页面也没有刷新。
inputbox = self.browser.find_element_by_id('id_new_item')
inputbox.send_keys('testing')
inputbox.send_keys(Keys.ENTER)
inputbox = self.browser.find_element_by_id('id_new_item')
解决起来很简单,如上图1行加入inputbox变量的声明,3行模拟回车操作即可。这样页面刷新,功能测试也就没法通过了。
7.5
坑10:这里在加载CSS后需要直接在本地跑服务器看情况,可是进去后输入item的时候会报错:lists_item.list_id does not EXIST.
这个问题的原因说明在迁移的时候没有把这个表的新的列建好,于是我尝试了python3 manage.py makemigrations,但是现实no changes detectd,说明迁移文件都已经就绪了。
接下来输入python3 manage.py migrate,出现了另一个提示叫NOT NULL constraint failed: lists_item.list_id。这个说明在建数据表的时候有问题,用python3 manage.py showmigrations查了一下原来0004的迁移文件失败了。
于是再输入python3 manage.py sqlmigrate lists 0004查看SQL,一看就不对劲了
BEGIN;
--
-- Add field list to item
--
ALTER TABLE "lists_item" RENAME TO "lists_item__old";
CREATE TABLE "lists_item" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "list_id" integer NOT NULL REFERENCES "lists_list" ("id") DEFERRABLE INITIALLY DEFERRED, "text" text NOT NULL);
INSERT INTO "lists_item" ("list_id", "text", "id") SELECT NULL, "text", "id" FROM "lists_item__old";
DROP TABLE "lists_item__old";
CREATE INDEX "lists_item_list_id_e742b95b" ON "lists_item" ("list_id");
COMMIT;
中间插入的时候不知道为何是 SELECT NULL, "text", "id",这样肯定是不符合外键非空的规范的。
为了找到终极问题,我用python3 manage.py sqlshell进去数据库看了一下,发现lists_item表是有数据的
1|Buy peacock feathers
2|Use peacock feathers to make a fly
这就是问题了,新增list列作为外键的时候因为没有既有的list,所以插入了一个空值导致了错误。
找到问题后,我直接把这两个表lists_item和lists_list删掉了,再重新创建数据库就好了。