Уведомления

Группа в Telegram: @pythonsu

#1 Март 29, 2017 23:07:17

lashnag
Зарегистрирован: 2017-03-29
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Unittest - mock подменяющий __init__ и возвращающий type исходного объекта

Добрый день! Я хочу, чтобы в метод передавалась переменная только определенного класса. Для этого я проверяю внутри метода на typeof
Теперь мне нужно написать тест, в котором я смогу подменить этот класс mock объектом, чтобы typeof вернул исходный класс + подменить конструктор исходного объекта
Как я могу это сделать?

Офлайн

#2 Март 29, 2017 23:12:37

4kpt_V
От: Харьков
Зарегистрирован: 2017-02-19
Сообщения: 299
Репутация: +  12  -
Профиль   Отправить e-mail  

Unittest - mock подменяющий __init__ и возвращающий type исходного объекта

Я понимаю, что сейчас говорю вне темы, но все же использовать unittest уже моветон Даже Великий и Ужасный на этом настаивает.

По Вашему вопросу. Код. Нужен код. Я реально не понял, что Вы хотите сделать.

Офлайн

#3 Март 30, 2017 02:08:11

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9997
Репутация: +  857  -
Профиль   Отправить e-mail  

Unittest - mock подменяющий __init__ и возвращающий type исходного объекта

lashnag
Теперь мне нужно написать тест, в котором я смогу подменить этот класс mock объектом
Там через patch() делаешь и прямо в строке пишешь подмену. Можешь потренироваться на какой-нибудь встроенной функции. Поменить input() например.

Вот тебе кусок из юнит-теста с подменой встроенной input()
  
import unittest
from unittest.mock import patch
 
...
 
class InputHandlerGoodInput(unittest.TestCase):
 
    def setUp(self):
        self.p1 = patch('checkmail.input', create=True)
        self.m1 = self.p1.start()
        self.p2 = patch('getpass.getpass')
        self.m2 = self.p2.start()
  
    def tearDown(self):
        self.p1.stop()
        self.p2.stop()
 
    def test_can_set_default_prompt_for_string_input(self):
        handler = InputHandler()
        handler.start(string_prompt='a')
        handler.input_string()
        handler.end()
        self.m1.assert_called_once_with('a')
 
    ...



Отредактировано py.user.next (Март 30, 2017 02:10:29)

Офлайн

#4 Март 30, 2017 16:27:00

lashnag
Зарегистрирован: 2017-03-29
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Unittest - mock подменяющий __init__ и возвращающий type исходного объекта

Прилагаю псевдокод того, что хочу сделать

 import unittest
class Data(object):
   def add_sub_data(self, sub_data):
      if type(sub_data) != SubData:
         raise Exception('Only SubData need')
      else:
         self.sub_data = sub_data
class SubData(object):
   def __init__(self, param1, param2, param3):
      self.param1 = param1
      self.param2 = param2
      self.param3 = param3
class DataTest(unittest.TestCase):
   def test_add_sub_test(self):
      # Здесь я хотел бы создать мок класса SubData, чтобы в него не надо было передавать param1, param2 и param3

Офлайн

#5 Март 30, 2017 16:32:06

lashnag
Зарегистрирован: 2017-03-29
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Unittest - mock подменяющий __init__ и возвращающий type исходного объекта

На php это делается достаточно просто. И точно возможно.

 $stub = $this->getMockBuilder('SubData')->disableOriginalConstructor()->setMethods(array())->getMock();

Офлайн

#6 Март 31, 2017 01:16:24

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9997
Репутация: +  857  -
Профиль   Отправить e-mail  

Unittest - mock подменяющий __init__ и возвращающий type исходного объекта

Вообще, принадлежность к классу проверяется через isinstance()

  
>>> from unittest.mock import Mock
>>> 
>>> m = Mock(spec='abc')
>>> 
>>> isinstance(m, str)
True
>>>

Но даже если у тебя type(), можно подменить сам type() способом, который я выше писал.



Отредактировано py.user.next (Март 31, 2017 01:17:02)

Офлайн

#7 Апрель 1, 2017 17:15:36

lashnag
Зарегистрирован: 2017-03-29
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Unittest - mock подменяющий __init__ и возвращающий type исходного объекта

Спасибо большое! Скажите, пожалуйста еще - через unittest нет ли возможности запустить все файлы в папке test рекурсивно или для этого только pyunit надо использовать?

Отредактировано lashnag (Апрель 1, 2017 17:42:59)

Офлайн

#8 Апрель 2, 2017 02:19:31

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9997
Репутация: +  857  -
Профиль   Отправить e-mail  

Unittest - mock подменяющий __init__ и возвращающий type исходного объекта

Сложная там система (сырая) python.org. discover() , но рабочая.

Конечно, можно в реальных проектах посмотреть, как сделано. Обычно как-то по-другому рекурсивный обход там делался. Так что можешь ещё поискать.



Отредактировано py.user.next (Апрель 2, 2017 02:21:53)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version