Fakultas Ilmu Komputer UI

Commit 2562e745 authored by Rahmania Astrid Mochtar's avatar Rahmania Astrid Mochtar
Browse files

Merge branch 'testinggoat/ch19-2' into 'master'

Testinggoat/ch19 2

See merge request !13
parents b619eb36 3e86200d
Pipeline #25786 passed with stages
in 5 minutes and 30 seconds
......@@ -206,4 +206,33 @@ Karena mutation score dari test adalah 100%, maka tidak perlu menambahkan test c
1. Menggunakan mock library menghasilkan code yang lebih clean.
2. Dalam mock library, cukup menggunakan decorator `patch` untuk menunjuk object yang ingin di-mock. Setelah test yang terdapat decorator tersebut dijalankan, object yang di-mock akan kembali ke bentuk awalnya sehingga tidak merubah object dalam test lain. Sementara dalam monkeypatching object tidak kembali ke keadaan awalnya sehingga dapat merusak test lain.
3. Mock library dapat me-record behaviour dari mock object yang dipanggil.
4. Mock library dapat me-return value spesifik dengan `return_value`, dan raise exception dengan `side_effect`.
\ No newline at end of file
4. Mock library dapat me-return value spesifik dengan `return_value`, dan raise exception dengan `side_effect`.
### Mock Tightly Coupled Pada Implementasi
Dalam testing sebaiknya yang dites adalah behaviour-nya, bukan implementasinya. Namun dalam mocking, hal tersebut tidak dapat direalisasikan. Contohnya dalam kode
```python
from unittest.mock import patch, call
[...]
@patch('accounts.views.messages')
def test_adds_success_message_with_mocks(self, mock_messages):
response = self.client.post('/accounts/send_login_email', data={
'email': 'edith@example.com'
})
expected = "Check your email, we've sent you a link you can use to log in."
self.assertEqual(
mock_messages.success.call_args,
call(response.wsgi_request, expected),
)
```
Implementasinya:
```python
messages.add_message(
request,
messages.SUCCESS,
"Check your email, we've sent you a link you can use to log in."
```
Dalam test nonmock akan pass, namun dalam test mock akan fail. Ini terjadi karena object yang di-mock adalah `accounts.views.messages` dan yang digunakan untuk assert adalah `messages.success`. Sementara dalam implementasi digunakan `messages.add_messages`. Sehingga meskipun hasil yang didapatkan sama, test yang dijalankan akan terus fail.
\ No newline at end of file
......@@ -2,8 +2,12 @@ from django.db import models
from django.contrib.auth.models import (
AbstractBaseUser, BaseUserManager, PermissionsMixin
)
from django.contrib import auth
import uuid
auth.signals.user_logged_in.disconnect(auth.models.update_last_login)
class Token(models.Model):
email = models.EmailField()
......
from accounts.models import Token
from django.test import TestCase
from django.contrib.auth import get_user_model
from django.contrib import auth
User = get_user_model()
User = auth.get_user_model()
class UserModelTest(TestCase):
......@@ -11,6 +11,12 @@ class UserModelTest(TestCase):
user = User(email='a@b.com')
user.full_clean() # should not raise
def test_no_problem_with_auth_login(self):
user = User.objects.create(email='edith@example.com')
user.backend = ''
request = self.client.request().wsgi_request
auth.login(request, user)
class TokenModelTest(TestCase):
def test_links_user_with_auto_generated_uid(self):
......
from django.conf.urls import url
# from django.contrib.auth import logout
from accounts import views
urlpatterns = [
......
......@@ -45,4 +45,14 @@ class LoginTest(FunctionalTest):
# 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)
\ No newline at end of file
# 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)
\ No newline at end of file
......@@ -16,19 +16,25 @@
<div class="container">
<div class="navbar">
{% if user.is_authenticated %}
<p>Logged in as {{ user.email }}</p>
<p><a id="id_logout" href="{% url 'logout' %}">Log out</a></p>
{% else %}
<form class="navbar-form navbar-right"
method="POST"
action="{% url 'send_login_email' %}">
Enter email to log in: <input name="email" type="text" />
{% csrf_token %}
</form>
{% endif %}
</div>
<nav class="navbar navbar-default" role="navigation">
<div class="container-fluid">
<a class="navbar-brand" href="/">Superlists</a>
{% if user.email %}
<ul class="nav navbar-nav navbar-right">
<li class="navbar-text">Logged in as {{ user.email }}</li>
<li><a href="{% url 'logout' %}">Log out</a></li>
</ul>
{% else %}
<form class="navbar-form navbar-right"
method="POST"
action="{% url 'send_login_email' %}">
<span>Enter email to log in:</span>
<input class="form-control" name="email" type="text" />
{% csrf_token %}
</form>
{% endif %}
</div>
</nav>
{% if messages %}
<div class="row">
......
Supports Markdown
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