Mock regular function (python) and API

Fachrur Rozi
Sulang
Published in
2 min readApr 4, 2018

Pada kesempatan kali ini saya akan membahas mengenai cara menggunakan mock pada python. Namun sebelum itu saya akan menjelaskan mengapa kita membutuhkan mock di dalam Test Driven Development.

Mock digunakan ketika kita memiliki fungsi yang tidak dapat kita prediksi output yang akan dihasilkan, misalnya sebuah fungsi random be

def get_random_state():
import random
import string
random = ''.join([
random.choice(string.ascii_letters + string.digits) for n in range(32)
])
return random

Fungsi tersebut akan menghasilkan String random sepanjang 32 karakter dan tentu saja kita tidak akan bisa menebak hasilnya.

Dengan fungsi test yang biasanya, kita akan melakukan:

def test_get_random_state(self):
expected = 'abashasdlkjsadf' # we cannot ensure the expected
actual = get_random_state()
self.assertEqual(expected, actual)

Tentu saja fungsi di atas akan Fail karena gagal menebak hasil random dari fungsi yang ditest. Dalam kasus seperti ini, kita membutuhkan perantara yang bernama MagicMock yang akan membantu kita menebak output dari suatu fungsi.

pip install -U mock

Fungsi test di atas dapat diubah menjadi:

from mock import patch@patch('get_random_state')
def test_get_random_state(self, state):
state.return_value = 'asdfgh'
expected = 'asdfgh'
actual = get_random_state

self.assertEqual(expected, actual)

Fungsi di atas menggunakan decorator @patch untuk memodifikasi hasil output dari fungsi get_random_state. Kita dapat memanipulasi keluaran fungsi tersebut dengan meinisialisasi hasil dengan .return_value.

Demikianlah cara untuk menggunakan mock untuk regular python function.

Kemudian saya mencoba bagaimana melakukan mock fungsi yang memanggil API (api linkedin) yang kami pakai untuk otentikasi user.

@patch('app_auth.views.json')def test_auth_method_get(self, json_mock):
request = self.factory.get('/auth/linkedin/')
self.middleware.process_request(request)
request.session['state'] = ""
request.session.save()
json_mock.loads.return_value = ({
'access_token': 'hahaha',
'expires_in': 1234,
'emailAddress': 'holaaa',
'firstName': 'halo',
'lastName': 'heduue',
'location': {'name': 'Jakarta'}
})
response = self.callback.get(request)
self.assertEqual(response.status_code, 302)

Jika diperhatikan, untuk melakukan mock api, kita perlu melakukan manipulasi pada json yang akan diterima oleh api

--

--