Django学习系列21:为每一个清单添加唯一URL
现在让我们来解决我们真正的问题,即我们的设计只允许一个全局列表。
我将演示一个关键的TDD技术:如何使用一个渐进的、循序渐进的过程来适应现有的代码,这些过程将您从工作状态转移到工作状态。测试山羊,而不是重构猫。
必要时采用小型设计
让我们考虑一下我们希望如何支持多个列表,但实际上,我们希望对此进行扩展,即不同的用户看不到彼此的清单,而每个用户都得到自己的url,作为返回已保存列表的一种方式。新设计可能是什么样子?
- 我们希望每个用户至少能够存储一个自己的清单。
- 清单由多个待办事项组成,这些项的主要属性是描述性文本。
- 要保存清单,以便多次访问。现在,卡一为用户提供一个唯一的URL。指向他们的清单,以后或许需要一种自动识别用户的机制,然后把他妈的清单显示出来。
为了实现第一条,看样子要把清单和其中的待办事项存入数据库,每个清单都有一个唯一的URL。
使用TDD 实现新设计

确保我们有回归测试
将我们的便笺簿转换成一个新的功能测试方法,它引入了第二个用户,并检查他们的待办事项列表是否与edith的不同;
我们将以与第一个非常相似的方式开始。Edith添加了第一个项来创建待办事项清单,但是我们引入了第一个新断言Edith的清单应该位于它自己的唯一URL:
def test_start_a_list_for_oner_user(self):
【……】 # 页面再次更新,她的清单中显示了这两个待办事项
self.wait_for_row_in_list_table('2: Use peacock feathers to make a fly')
self.wait_for_row_in_list_table('1: Buy peacock feathers') def test_multiple_users_can_start_lists_at_different_urls(self):
self.browser.get(self.live_server_url)
inputbox = self.browser.find_element_by_id('id_new_item')
inputbox.send_keys("Buy peacock feathers")
inputbox.send_keys(Keys.ENTER)
self.wait_for_row_in_list_table('1:Buy peacock feathers') edith_list_url = self.browser.current_url
self.assertRegex(edith_list_url, '/lists/.+')
assertRegex是单元测试中的一个辅助函数,检查字符串是否和正则表达式匹配,我们使用整个方法检查是否实现了新的REST式设计。
接下来我们想象一个新用户出现。我们要检查他们在访问主页时没有看到任何Edith的项目,并且他们得到了自己清单的唯一URL。
从self.fail()之前的注释开始,把随后的内容都删掉,替换成下面功能测试的新结尾。
self.assertRegex(edith_list_url, '/lists/.+') #
# 现在一个新用户出现弗朗西斯
## 使用一个新浏览器会话
## 确保伊迪斯的信息不会从cookie 中泄露出来
self.browser.quit()
self.browser = webdriver.Firefox()
# 弗朗西斯访问首页,页面中看不见Edith的清单
self.browser.get(self.live_server_url)
page_text = self.browser.find_element_by_tag_name('body').text
self.assertNotIn('Buy peacock feathers', page_text)
self.assertNotIn('make a fly', page_text)
# 弗兰西斯输入一个新待办事项,新建一个清单
inputbox = self.browser.find_element_by_id('id_new_item')
inputbox.send_keys('Buy milk')
inputbox.send_keys(Keys.ENTER)
self.wait_for_row_in_list_table('1: Buy milk')
# 弗兰西斯获得了她唯一的URL
francis_list_url = self.browser.current_url
self.assertRegex(francis_list_url, '/lists/.+')
self.assertNotEqual(francis_list_url, edith_list_url)
# 这个页面没有伊迪斯的清单
page_text = self.browser.find_element_by_tag_name('body').text
self.assertNotIn('Buy peacock feathers', page_text)
self.assertIn('Buy milk', page_text)
使用两个#号表示“元注释”,元注释的作用是说明测试的工作方式,以及为什么这么做。使用两个#号时为了和功能测试中国常规注释区分开,这个元注释时发给未来的自己的消息,如果没有这个消息,到时候自己都会觉得奇怪,想知道为什么要退出浏览器在启动一个新会话。
运行结果:未识别到弗朗西斯的URL和清单。
Django学习系列21:为每一个清单添加唯一URL的更多相关文章
- Django学习系列之Form基础
Django学习系列之Form基础 2015-05-15 07:14:57 标签:form django 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追 ...
- Caffe学习系列(21):caffe图形化操作工具digits的安装与运行
经过前面一系列的学习,我们基本上学会了如何在linux下运行caffe程序,也学会了如何用python接口进行数据及参数的可视化. 如果还没有学会的,请自行细细阅读: caffe学习系列:http:/ ...
- Django学习系列6:使用selenium测试用户交互
学习系列5中的单元测试有报错信息,这儿来编写functional_tests.py文件,扩充其中的功能测试 # File: functional_test.py # Author: Rxf # Cre ...
- Django学习系列之ORM-QuerySetAPI
基本操作 # 增 models.Tb1.objects.create(c1='xx', c2='oo') #增加一条数据,可以接受字典类型数据 **kwargs obj = models.Tb1(c1 ...
- Django学习系列20:改进功能测试
隐示等待和显示等待 我们看看在功能测试中function_tests.py中的 time.sleep inputbox.send_keys(Keys.ENTER) time.sleep(1) self ...
- Django学习系列之request对象
先来一个简单的实例 urls.py from django.conf.urls import url from django.contrib import admin from cmdb import ...
- Django学习系列之django restframework
曾几何时,Ajax已经统治了Web开发中的客户端,而REST成为web世界中最流行的架构风格(architecture style).所以我们的选择变得很简单:前端ajax访问后端的RESTful A ...
- django学习系列——python和php对比
python 和 php 我都是使用过,这里不想做一个非常理性的分析,只是根据自己的经验谈一下感想. 在web开发方面,无疑 php 更甚一筹. 从某种角度来说,php 就是专门为 web 定制的语言 ...
- Django学习系列之Python+Xadmin
项目树 引入xadmin pycharm在项目中创建存放xadmin的目录 右键项目名称-->pythonpackage-->输入名称:extra_app 拷贝xadmin代码到extra ...
随机推荐
- Leetcode之动态规划(DP)专题-123. 买卖股票的最佳时机 III(Best Time to Buy and Sell Stock III)
Leetcode之动态规划(DP)专题-123. 买卖股票的最佳时机 III(Best Time to Buy and Sell Stock III) 股票问题: 121. 买卖股票的最佳时机 122 ...
- day34 并行并发、进程开启、僵尸及孤儿进程
day34 并行并发.进程开启.僵尸及孤儿进程 1.并行与并发 什么是并行? 并行指的是多个进程同时被执行,是真正意义上的同时 什么是并发? 并发指的是多个程序看上去被同时执行,这是因为cpu在多个程 ...
- linux文件权限更改命令chmod及数字权限实践总结
改变权限属性命令chmod chmod 是用来改变文件或目录权限的命令,但只有文件的属主和超级用户root才有这种权限.通过chmod来改变文件或目录的权限有两种方法:一种是通过权限字母和操作符表达 ...
- vi去掉^M
Windows下编辑的文本文件or程序文件,拷贝到linux下,用vi打开时,有时候会看到每行末尾有个 ^M 的符号. 这里介绍一个可以快速去除^M符号的方法: 用vi编辑器打开该文件,然后输入: : ...
- 关于Oracle MAX()KEEP(DENSE_RANK LAST/FIRST ORDER BY ) 函数的使用分析
MAX()/MIN() KEEP(DENSE_RANK LAST/FIRST) 函数 解释: 1. max() 获取最大值: 2.min() 获取最小值; 3. keep 保持满足括号内条件的内容; ...
- pycharm 安装好,只要三部! 超级简单教程!
pycharm的安装,确实比较麻烦,所以特意做了一期简单版本的安装教程,跟着教程走...只要三部! →下载 链接:https://pan.baidu.com/s/1JxZgAhPVKAIoM1_jpD ...
- python3列表、元组
列表.元组操作 列表是我们最以后最常用的数据类型之一,通过列表可以对数据实现最方便的存储.修改等操作.列表中的每个元素都分配一个数字也就是它的位置,或叫索引,第一个索引是0,第二个索引是1,依此类推. ...
- 基于从库+binlog方式恢复数据
基于从库+binlog方式恢复数据 将bkxt从库的全备份在rescs5上恢复一份,恢复到6306端口,用cmdb操作 恢复全备后执行如下操作 set global read_only=OFF; st ...
- vue 模拟测试数据构建
等价=====================================
- C 中 char、signed char 和 unsigned char 的区别
C 中 char.signed char 和 unsigned char 的区别 来源:http://bbs.chinaunix.net/thread-889260-1-1.html 参考:https ...