How to write
test
Shunsuke Hida

飛田 俊介
in Django
Geekhouse
Shinjuku
Akihabara
Castalia
Goocus
Django 1.7
Python 3. 4. 2
Structure of
test
1. Prepare
def test_de_lorean_get_people_back_to_the_future(self):

de_lorean = DeLorean()

brown, marty, jeniffer = Brown(), Marty(), Jeniffer()



de_lorean.passengers = [brown, marty, jeniffer]



de_lorean.run()



self.assertIn(brown, __future__)

self.assertIn(marty, __future__)

self.assertIn(jeniffer, __future__)
2. Run
def test_de_lorean_get_people_back_to_the_future(self):

de_lorean = DeLorean()

brown, marty, jeniffer = Brown(), Marty(), Jeniffer()



de_lorean.passengers = [brown, marty, jeniffer]



de_lorean.run()



self.assertIn(brown, __future__)

self.assertIn(marty, __future__)

self.assertIn(jeniffer, __future__)
3. Assert
def test_de_lorean_get_people_back_to_the_future(self):

de_lorean = DeLorean()

brown, marty, jeniffer = Brown(), Marty(), Jeniffer()



de_lorean.passengers = [brown, marty, jeniffer]



de_lorean.run()



self.assertIn(brown, __future__)

self.assertIn(marty, __future__)

self.assertIn(jeniffer, __future__)
What can you test?
Request
Response
What can you test?
urls.py
Model
View
Template
View HTML
etc…
url
Context
get, save
render
dispatch
Data
Request
Response
What can you test?
urls.py
Model
View
Template
View HTML
etc…
url
Context
get, save
render
dispatch
Data
Request
Response
What can you test?
urls.py
Model
View
Template
View HTML
etc…
url
Context
get, save
render
dispatch
Data
RequestFactory
class HelloWorldTestCase(TestCase):

def test_hello_world_template(self):

factory = RequestFactory()

request = factory.get('/')

response = render(

request,

template_name='sample_app/hello_world.html',

dictionary=dict(message='hello')

)

self.assertContains(response, 'hello')
Request
Response
What can you test?
urls.py
Model
View
Template
View HTML
etc…
url
Context
get, save
render
dispatch
Data
TestCase.client
class HelloWorldTestCase(TestCase):

def test_hello_world_view(self):

response = self.client.get('/sample_app/hello_world/')

self.assertTemplateUsed(response, 'sample_app/hello_world.html')

self.assertEqual(response.context['message'], 'Hello World')
Mock
unittest.mock (new in Python 3.3)
Request
Response
What can you test?
urls.py
Model
View
Template
View HTML
etc…
url
Context
get, save
render
dispatch
Data
Mock - return_value
class Chapter(models.Model):

name = models.CharField(max_length=255)



def get_name(self):

return 'chapter ' + self.name
ChapterView
get_name
Mock - return_value
@mock.patch('sample_app.models.Chapter.get_name')

def test_get_name(self, mock_get_name):

mock_get_name.return_value = ‘abc'


chapter = ChapterFactory()

# chapter.get_name() == ‘abc’
Mock - assert_called_with
@mock.patch('sample_app.models.Chapter.get_name', autospec=True)

def test_chapter_get_name_is_called(self, mock_get_name):


chapter = ChapterFactory()


# call chapter.get_name() somewhere


mock_get_name.assert_called_with(

chapter,

prefix='chapter '

)

Mock
Mocked
Chapter
View
get_name
assert_called_with
return_value
See Also
Obey the Testing Goat!

(Test Driven Development with Python)

http://www.obeythetestinggoat.com/
Test of Django itself

https://github.com/django/django/tree/
master/tests
Can they go back to the
future?
def test_de_lorean_get_people_back_to_the_future(self):

de_lorean = DeLorean()

brown, marty, jeniffer = Brown(), Marty(), Jeniffer()



de_lorean.passengers = [brown, marty, jeniffer]



de_lorean.run()



self.assertIn(brown, __future__)

self.assertIn(marty, __future__)

self.assertIn(jeniffer, __future__)
TypeError: argument of type 'module' is not iterable
__future__
import types

import __future__





class IterableModule(types.ModuleType):

def __init__(self, *args, **kwargs):

super().__init__(*args, **kwargs)

self.people = []



def __iter__(self):

return iter(self.people)





class DeLorean(object):

def __init__(self):

self.passengers = []



def run(self):

future = globals()['__future__'] = IterableModule('__future__')

for passenger in self.passengers:

future.people.append(passenger)
import
import




class






class


.
----------------------------------------------------------------------
Ran 1 test in 0.000s
OK
Thank you!

How to write test in Django