Найти - Пользователи
Полная версия: Unittest - mock подменяющий __init__ и возвращающий type исходного объекта
Начало » Python для новичков » Unittest - mock подменяющий __init__ и возвращающий type исходного объекта
1
lashnag
Добрый день! Я хочу, чтобы в метод передавалась переменная только определенного класса. Для этого я проверяю внутри метода на typeof
Теперь мне нужно написать тест, в котором я смогу подменить этот класс mock объектом, чтобы typeof вернул исходный класс + подменить конструктор исходного объекта
Как я могу это сделать?
4kpt_V
Я понимаю, что сейчас говорю вне темы, но все же использовать unittest уже моветон Даже Великий и Ужасный на этом настаивает.

По Вашему вопросу. Код. Нужен код. Я реально не понял, что Вы хотите сделать.
py.user.next
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')
 
    ...
lashnag
Прилагаю псевдокод того, что хочу сделать

 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
lashnag
На php это делается достаточно просто. И точно возможно.

 $stub = $this->getMockBuilder('SubData')->disableOriginalConstructor()->setMethods(array())->getMock();
py.user.next
Вообще, принадлежность к классу проверяется через isinstance()
  
>>> from unittest.mock import Mock
>>> 
>>> m = Mock(spec='abc')
>>> 
>>> isinstance(m, str)
True
>>>

Но даже если у тебя type(), можно подменить сам type() способом, который я выше писал.
lashnag
Спасибо большое! Скажите, пожалуйста еще - через unittest нет ли возможности запустить все файлы в папке test рекурсивно или для этого только pyunit надо использовать?
py.user.next
Сложная там система (сырая) python.org. discover() , но рабочая.

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