Recordando o nosso ciclo de TDD (vermelho, verde, refatorar), quando chegamos ao estado verde, sempre devemos ponderar se cabe alguma refatoração em nosso código, seja código de aplicação ou código de teste.
Agora, nossa aplicação está com duas views: uma responsável por lidar com a página principal e outra para lidar com a lista de itens individual. Ambas usam o mesmo template, passando ao mesmo todos os itens disponíveis no banco de dados.
Se avaliarmos os testes unitários que temos disponível pode ser que exita algum que possa ser eliminado decorrente da evolução da aplicação. O comando abaixo percorre nosso arquivo lists/tests.py e apresenta o nome de todos os métodos de teste.
O último método de nossa classe de teste HomePage, test_displays_all_list_itens, pode ser eliminado, pois, criamos a classe ListViewTest e o método de teste test_displays_all_list_itens mais adequado para a evolução de nossa aplicação. Desse modo, o conjunto de testes unitários ficará conforme abaixo.
from django.urls import resolvefrom django.test import TestCasefrom lists.views import home_pagefrom lists.models import ItemclassHomePageTest(TestCase):deftest_root_url_resolves_to_home_page_view(self): found =resolve('/') self.assertEquals(found.func, home_page)deftest_home_page_returns_correct_html(self): response = self.client.get('/') self.assertTemplateUsed(response, 'home.html')deftest_only_saves_items_when_necessary(self): self.client.get('/') self.assertEquals(Item.objects.count(), 0)deftest_can_save_a_POST_request(self): self.client.post('/', data={'item_text': 'A new list item'}) self.assertEquals(Item.objects.count(), 1) new_item = Item.objects.first() self.assertEquals(new_item.text, 'A new list item')deftest_redirects_after_POST(self): response = self.client.post('/', data={'item_text': 'A new list item'}) self.assertEquals(response.status_code, 302) self.assertEquals(response['location'], '/lists/the-only-list-in-the-world/')classListViewTest(TestCase):deftest_displays_all_list_itens(self): Item.objects.create(text='itemey 1') Item.objects.create(text='itemey 2') response = self.client.get('/lists/the-only-list-in-the-world/') self.assertContains(response, 'itemey 1') self.assertContains(response, 'itemey 2')classItemModelTest(TestCase):deftest_saving_and_retriving_items(self): first_item =Item() first_item.text ='The first (ever) list item' first_item.save() second_item =Item() second_item.text ='Item the second' second_item.save() saved_items = Item.objects.all() self.assertEquals(saved_items.count(),2) first_saved_item = saved_items[0] second_saved_item = saved_items[1] self.assertEquals(first_saved_item.text, 'The first (ever) list item') self.assertEquals(second_saved_item.text, 'Item the second')
A execução do mesmo, sendo uma refatoração, deveria continuar sendo de sucesso, conforme ilustrado abaixo: