Найти - Пользователи
Полная версия: mock и как с ним работать
Начало » Python для новичков » mock и как с ним работать
1
xwizard
Здравствуйте всем.
У меня есть желание написать умные юнит-тесты для драйвера устройства Х, которые будут работать без этого устройства.
Мне нужно как-то использовать модуль mock, чтобы импортировать модуль драйвера в тест и запускать его функции, которые не будут обращаться к устройству а будут логировать все что посылается на устройство, чтобы можно было потом эти данные сравнить с ожидаемыми.
Посмотрел примеры использования данного модуля и как-то не воодушевился.
Киньте ссылкой или примером. Спасибо.
Ed
Мне помогло то, что мне советовали тут: http://python.su/forum/topic/14791/
reclosedev
class Driver(object):
    def foo(a, b, c):
        print a, b, c
        
    def bar(a, b, c):
        print a, b, c
        
import mock
 
driver = mock.Mock()
 
driver.foo(1, 2, 3)
driver.bar(4, 5, 6)
 
driver.foo.assert_called_with(1, 2, 3)
driver.bar.assert_called_with(4, 5, 7)
#AssertionError: Expected call: bar(4, 5, 7)
#Actual call: bar(4, 5, 6)
Также Driver может быть модулем, даже тем, который импортирует другая библиотека, код которой редактировать нежелательно (обходится патчингом sys.modules с помощью Mock).

Выложите пример теста, может подскажут как это сделать с Mock.
xwizard
reclosedev, это будет работать???
откуда у driver появляются методы foo и bar? как мы можем быть уверены, что это именно mock объект от класса Driver?
и как “проверить” вывод, если функция скажем такая:
class Driver(object):
    def f(a,  b):
        if b.get(s) and a.get(s):
            return a.s + b.s
       else return a.get(s)
  
т.е. мы как-то преобразуем имеющиеся параметры и что-то возвращаем (строку)

и тогда в юнит тесте мы импортируем драйвер,
import mock
import driver
dr = mock.Mock() # or may be mock.Mock(Driver) ?
a = []
b = 3
c['s'] = 'test'
dr.f(a,b)
dr.f(a,c)
driver.foo.assert_called_with(c, c)
reclosedev
Надеюсь вы читали документацию? http://www.voidspace.org.uk/python/mock/getting-started.html
xwizard
откуда у driver появляются методы foo и bar?
В этом примере Driver полностью заменен на Mock, поэтому у него есть любые методы.
xwizard
как мы можем быть уверены, что это именно mock объект от класса Driver?
Мы же сами заменили.
xwizard
и как “проверить” вывод, если функция скажем такая:
Зачем ее вообще заменять Mock'ом, она же ничего внешнего не делает?

Редко когда нужно заменять объект полностью, чаще Mock'ом заменяются отдельные методы:
import driver
with patch.object(driver.Driver, 'query_device') as mock_method:
     mock_method.return_value = "1234"
     real = driver.Driver()
     real.query_device(1, 2, 3)
     # или другие вызовы, которые могут вызвать query_device
mock_method.asserd_called_with(1, 2, 3)

На конкретном примере было бы проще объяснить.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB