Форум сайта python.su
Добрый день! Я хочу, чтобы в метод передавалась переменная только определенного класса. Для этого я проверяю внутри метода на typeof
Теперь мне нужно написать тест, в котором я смогу подменить этот класс mock объектом, чтобы typeof вернул исходный класс + подменить конструктор исходного объекта
Как я могу это сделать?
Офлайн
Я понимаю, что сейчас говорю вне темы, но все же использовать unittest уже моветон Даже Великий и Ужасный на этом настаивает.
По Вашему вопросу. Код. Нужен код. Я реально не понял, что Вы хотите сделать.
Офлайн
lashnagТам через patch() делаешь и прямо в строке пишешь подмену. Можешь потренироваться на какой-нибудь встроенной функции. Поменить input() например.
Теперь мне нужно написать тест, в котором я смогу подменить этот класс mock объектом
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)
Офлайн
Прилагаю псевдокод того, что хочу сделать
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
Офлайн
На php это делается достаточно просто. И точно возможно.
$stub = $this->getMockBuilder('SubData')->disableOriginalConstructor()->setMethods(array())->getMock();
Офлайн
Вообще, принадлежность к классу проверяется через isinstance()
>>> from unittest.mock import Mock >>> >>> m = Mock(spec='abc') >>> >>> isinstance(m, str) True >>>
Отредактировано py.user.next (Март 31, 2017 01:17:02)
Офлайн
Спасибо большое! Скажите, пожалуйста еще - через unittest нет ли возможности запустить все файлы в папке test рекурсивно или для этого только pyunit надо использовать?
Отредактировано lashnag (Апрель 1, 2017 17:42:59)
Офлайн
Сложная там система (сырая) python.org. discover() , но рабочая.
Конечно, можно в реальных проектах посмотреть, как сделано. Обычно как-то по-другому рекурсивный обход там делался. Так что можешь ещё поискать.
Отредактировано py.user.next (Апрель 2, 2017 02:21:53)
Офлайн