zoukankan      html  css  js  c++  java
  • 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/.+')  # 1
    
            # 现在一个新用户出现弗朗西斯
            ## 使用一个新浏览器会话
            ## 确保伊迪斯的信息不会从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和清单。

  • 相关阅读:
    apache commons-io相关介绍-IOUtils类
    apache commons-io相关介绍-DirectoryWalker类
    apache commons-io相关介绍-FileUtils类
    apache commons-io相关介绍-monitor包
    android笔记--AsyncTask例子
    Java Swing中的SwingWorker
    Predicting Boston Housing Prices
    matplotlib.pyplot 中很好看的一种style
    机器学习算法比较
    udacity 机器学习课程 project2
  • 原文地址:https://www.cnblogs.com/ranxf/p/11714692.html
Copyright © 2011-2022 走看看