@@ -221,7 +221,92 @@ Hal ini akan membuat mutant menghasilkan kode response 302, sedangkan kode yang
#### Mocking Manually vs Library
Mock adalah sebuah objek yang meniru tingkah laku dari sebuah objek.
Dengan adanya Mock, developer dipermudah untuk fokus menguji method suatu method tanpa harus memikirkan method lain (Unit Test). Kegiatan mocking object dapat dilakukan dengan 2 cara yaitu, secara manual dan menggunakan bantuan library yang telah disediakan bahasa tertentu, dalam hal ini Python. Berikut adalah perbedaan antara mocking secara manual dengan menggunakan library.
1. Mocking Manually
Dalam chapter 19, saya telah membuat fungsi `fake_send_email` untuk mengimitasi fungsi `send_login_email`. Fungsi `send_login_email` melibatkan fungsi `send_mail` yang merupakan bawaan dari module django.core.mail. Secara sederhana, `send_login_email` melibatkan modul lain dan tidak memungkinkan untuk menguji `send_login_email` tanpa fungsi tersebut. Oleh karena itu, saya membuat fungsi `fake_send_email` dan mengalihkan pemanggilan kode yang pada awalnya memanggil `send_login_email` menjadi `fake_send_email`.
Finally, `fake_send_mail` successfully imitate `send_mail`. As you can see, `fake_send_mail` store all `send_mail` attributes in its attribute using `self`.
> Method has been mocked! So, are we done? Does it provide the best way to mock?
> How if other class need the exactly same mocking object?
> Now let's take a look to `Mocking using Library` section.
2. Mocking using Library
Now we do mocking the same method, `send_email`, using `unittest.mock` library.
Moreover, import modules in the middle of code will screwing up the code quality (not best practice).
Also, using library for mocking is pretty simple - in this case just using @patch(`modules_path`) and we're done - and make the mocking object become reusable.
> **Summary**
> Manual Mock:
> 1. Dirty Code
> 2. Redundant with the real function, we should re-construct real object in the fake method to do
> imitation.
>
> Mocking with Library:
> 1. Readable code, no object creation in testing class
> 2. Fully-package! No need to write the construct the object (fake) to mock real object