Във вторник Петър ме подръчка да test-drive-на имплементацията на третата функция от втора задача. Публикувам кодът тук. Не е завършено решение, но се надявам да илюстрирам какво е да правите test-driven development.
import unittest
def cache(func, size):
storage = {}
def cached(*args):
if args in storage:
return storage[args]
result = func(*args)
storage[args] = result
return result
return cached
class ThingsTest(unittest.TestCase):
def setUp(self):
self.number_of_calls = 0
def call_counter(self):
def counter(x):
self.number_of_calls += 1
return counter
def test_simple_caching(self):
cached_function = cache(self.call_counter(), 10)
cached_function(0)
cached_function(0)
self.assertEqual(1, self.number_of_calls)
def test_calling_with_arguments(self):
cached_function = cache(self.call_counter(), 10)
cached_function(1)
cached_function(2)
cached_function(2)
self.assertEqual(2, self.number_of_calls)
def test_returns_the_result_from_the_original_call(self):
def func(x):
return 42
self.assertEqual(42, cache(func, 10)(0))
if __name__ == '__main__':
unittest.main()
Не съм имплементирал лимита на кеша. Ако желаете да се пробвате, можете да го довършите. Споделете крайния резултат и какво сте научили от упражнението и ще ви дадем бонус точка.
Аз бих подходил по следния начин:
- Първо бих добавил тест, който да проверя че превишаването на лимита резултира в ново извикване.
- След това ще пропусна теста със
@skip
. - Ще променя
storage
да не бъде речник, а да бъде списък от двойки ала[((1, 2), 'result'), ((3, 4), 'another result')]
. След тази промяна искам тестовете да минават. - Махам
@skip
от теста добавен в стъпка 1. Карам го да мине. - В този момент подменям
storage
да бъдеOrderedDict
или някаква сходна структура.
Някой сеща ли се защо?