@@ -673,3 +674,52 @@ Berdasarkan buku **Test-Driven Development with Python 2nd Edition,** tutorial i
1. Mengimplementasikan *custom dedicated list* untuk setiap pengguna, dengan menerapkan **Passwordless Authentication**, dengan menyimpan *entity*`Token` di file `models.py` dari app yang berisikan email pengguna dan sebuah **unique id (uid)** yang di-*generate* secara otomatis oleh sistem. Pengimplementasian fitur baru ini dilakukan di *development branch* dan tidak disertai TDD, dikarenakan masih bersifat ***trial and error***. Hal ini dapat disebut juga dengan **Spiking**.
2. Setelah fitur *passwordless authentication* berhasil diimplementasikan pada *development branch*, dilakukan implementasi secara menyeluruh dengan melibatkan proses TDD didalamnya, dan dilakukan pada *staging/production branch*. Hal ini disebut juga dengan **De-Spiking**.
## Penjelasan Tutorial 8
Berdasarkan buku **Test-Driven Development with Python 2nd Edition, bab 19.1 - 19.5,** terdapat beberapa perbedaan antara **manual mocking** dengan menggunakan ***mock library*** bawaan dari Django. Perbedaan utamanya terdapat pada penggunaan *method* yang akan ditest.
Pada manual mocking, digunakan sebuah *method* baru yang memiliki fungsionalitas sama dengan *method* yang akan ditest, tetapi menggunakan data *dummy*, seperti contoh dibawah ini.
```python
deftest_sends_mail_to_address_from_post(self):
self.send_mail_called=False
#fake method, with same functionality as tutorial 7's send_mail method
# replacing tutorial 7's send_mail method with the fake one
tutorial_7.views.send_mail=fake_send_mail
self.client.post(
'/tutorial-7/send_email',
data={
'email':'izzanfi@hotmail.com',
}
)
```
**Penjelasan:** pada potongan kode diatas, terdapat *inner method* baru yang bernama `fake_send_mail` yang merupakan *method* dengan fungsionalitas yang sama dengan *method*`send_mail` yang terdapat pada file `views.py`, namun dengan data-data *dummy*. Kemudian, dilakukan *assignment**method*`send_mail` dengan *inner method* yang sebelumnya sudah dibuat, dan dilakukan pemanggilan POST request secara normal.
Django telah menyediakan sebuah *library* untuk melakukan *automatic mocking*, yaitu bernama `unittest.mock.path`. *Library* ini bekerja dengan menempelkan sebuah *decorator* pada *test case method* yang akan ditest, seperti contoh dibawah ini.
**Penjelasan:** pada potongan kode diatas, terdapat *decorator* yang diletakkan diatas *test case method*, yaitu `@patch('tutorial_7.views.send_mail')`, dimana *decorator* tersebut menandakan bahwa *test case method* dibawahnya akan melakukan *mocking* terhadap *method*`send_mail` yang terdapat di file `views.py` milik modul `tutorial_7`. Selanjutnya, *method* yang sudah dilakukan *mocking* tersebut disimpan dalam sebuah parameter yang bernama `mock_send_mail`. Dan dilakukan pengecekan apakah *method* tersebut terpanggil melalui POST request, dan pencocokan argumen-argumen yang diterima oleh *method* yang sudah dilakukan *mocking* tersebut.