Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 22, 2012 22:20:45

xwizard
Зарегистрирован: 2012-06-22
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

mock и как с ним работать

Здравствуйте всем.
У меня есть желание написать умные юнит-тесты для драйвера устройства Х, которые будут работать без этого устройства.
Мне нужно как-то использовать модуль mock, чтобы импортировать модуль драйвера в тест и запускать его функции, которые не будут обращаться к устройству а будут логировать все что посылается на устройство, чтобы можно было потом эти данные сравнить с ожидаемыми.
Посмотрел примеры использования данного модуля и как-то не воодушевился.
Киньте ссылкой или примером. Спасибо.

Офлайн

#2 Июнь 22, 2012 23:13:49

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

mock и как с ним работать

Мне помогло то, что мне советовали тут: http://python.su/forum/topic/14791/



Офлайн

#3 Июнь 22, 2012 23:27:44

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

mock и как с ним работать

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.

Офлайн

#4 Июнь 22, 2012 23:49:12

xwizard
Зарегистрирован: 2012-06-22
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

mock и как с ним работать

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)

Офлайн

#5 Июнь 23, 2012 09:46:58

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

mock и как с ним работать

Надеюсь вы читали документацию? 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)

На конкретном примере было бы проще объяснить.

Отредактировано reclosedev (Июнь 23, 2012 09:47:14)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version