使用Django 測試客戶端一起測試視圖,模板和URL
Django 測試客戶端
self.client.get(url) 測試客戶端是Django中TestCase類的一個屬性名.
至此已經在網站中可以創建一個清單了。
那麽,現在是可以在unit test中測試新建的清單了
為新建清單添加了一個視圖函數,並映射給了url ‘^/Lists/new$‘. 在哪裏使用它呢? 在首頁的新建清單 form的Action中指定這個url。
目前的實現是:
1. get 首頁,打開首頁。能看到 輸入待辦事項的清單。
2. post 首頁,可以創建一個list.並在list中顯示該待辦事項。打開的是新建list的 url
3. post list 頁面。能看到新建的待辦事項
目前的問題是:
1. 目前只能有一個list
2. 一個list中顯示所有的待辦事項,不能隔離。
解決問題:
處理隔離問題,必須修改模型,新建一個 List 類。並讓類和item 關聯起來. 需要用到 model的知識。
List是單獨的自己: 在url中使用正則式,加入一個捕獲組 (.+) ,捕獲到的文本會作為參輸傳入視圖
Item 每個Item應該存在某個List中。
捕獲組 (.+)不僅可以捕獲 /(.+)/ 也可以捕獲 /((.+)/new_item ..... 所以 寫url時,要避免使用的正則式,匹配太廣.
response = self.client.get(‘/Lists/%id/‘ % (correct_list.id,))
self.assertEqual(response.context[‘list‘],correct_list) # response.context 表示要傳入render函數的上下文。 Django客戶端把上下文附在response對象上,方便測試.
template 中:
{% for new_item_text in list.item_set.all %} # .item_set 叫做反向查詢。是Django提供的非常有用的ORM功能。可以在其他表中查詢某個對象的相關紀錄。
所以在template的from中。可以傳入一個modle實例。然後根據這個實例找相關的其他對象實例:
<form method="POST" action=‘/Lists/{{list.id}}/new‘>
<input name="item_text" id="id_new_item" placeholder="Enter a to-do item" />
{% csrf_token %}
</form>
<table id="id_list_table">
{% for new_item_text in list.item_set.all %}
<tr><td>{{ forloop.counter}}: {{new_item_text.text}}</td></tr>
{% endfor %}
</table>
使用Django 測試客戶端一起測試視圖,模板和URL