Fakultas Ilmu Komputer UI

Commit ad5f4849 authored by Syahrul Ardiansyah's avatar Syahrul Ardiansyah
Browse files

Complete section 19 + README

parent d17e1be7
Pipeline #25790 failed with stage
in 1 minute and 39 seconds
......@@ -23,3 +23,9 @@ Test yang saya buat sebelumnya sudah strongly killed, sehingga saya tidak perlu
KEtika kita mencoba teknologi atau tools baru, terkadang kita ingin tahu bagaimana cara kerjanya tanpa perlu terganggung oleh pembuatan unit test terlebih dahulu. Pun jika kita belum tahu dan langsung membuat unit test untuk teknologi tersebut, hasilnya belum tentu benar. Oleh sebab itu, dalam TDD diperbolehkan untuk membuat prototype dari fitur yang akan ditest tanpa membuat test-nya terlebih dahulu, yang disebut dengan "Spiking".
Ketika kita sudah mengetahui bagaimana implementasi dari teknologi yang kita pelajari, barulah kita bisa membuat functional test dari fitur tersebut. Setelah test dibuat, kita dapat menulis kembali prototype yang telah kita buat tadi dan kembali menerapkan TDD seperti biasanya. Proses tersebut dinamakan "De-Spiking".
## Latihan 8
Manual mocking adalah implementasi mock dengan cara membuat sendiri method mock dari sebuah method yang mengembalikan nilai yang kita inginkan. Sedangkan jika kita menggunakan mock library, mock method dari method yang kita inginkan akan dibuatkan oleh library tersebut, kita hanya tinggal mengatur behavior dari mock tersebut.
Mocking dilakukan pada sebuah method yang dipanggil saat sebuah method dijalankan pada sebuah test. Artinya dalam implementasi method tersebut, setiap pemanggilannya akan bergantung pada method yang dibuat mocknya. Sebuah class/method yang memiliki ketergantungan tinggi dengan class/method lainnya disebut tightly coupled. Misalnya pada source code, setiap pemanggilan method GET untuk url login akan memanggil method auth pada accounts.views. Oleh sebab itu dapat disimpulkan bahwa method login tightly coupled dengan method auth.
from django.conf.urls import url
from accounts import views
from django.contrib.auth.views import logout
urlpatterns = [
url(r'^send_email$', views.send_login_email, name='send_login_email'),
url(r'^login$', views.login, name='login'),
url(r'^logout$', views.logout, name='logout'),
url(r'^logout$', logout, {'next_page': '/'}, name='logout'),
]
......@@ -44,3 +44,19 @@ class LoginTest(FunctionalTest):
)
navbar = self.browser.find_element_by_css_selector('.navbar')
self.assertIn(TEST_EMAIL, navbar.text)
self.wait_for(
lambda: self.browser.find_element_by_link_text('Log out')
)
navbar = self.browser.find_element_by_css_selector('.navbar')
self.assertIn(TEST_EMAIL, navbar.text)
# Now she logs out
self.browser.find_element_by_link_text('Log out').click()
# She is logged out
self.wait_for(
lambda: self.browser.find_element_by_name('email')
)
navbar = self.browser.find_element_by_css_selector('.navbar')
self.assertNotIn(TEST_EMAIL, navbar.text)
......@@ -16,7 +16,7 @@
{% if user.email %}
<ul class="nav navbar-nav navbar-right">
<li class="navbar-text">Logged in as {{ user.email }}</li>
<li><a href="#">Log out</a></li>
<li><a href="{% url 'logout' %}">Log out</a></li>
</ul>
{% else %}
<form
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment