2016-06-21 5 views
6

Я пытаюсь высмеять класс утилиты (в этом случае утилиту журнала python) в модульном тесте.Как использовать monkeypatch в методе «установки» для модульных тестов с использованием pytest?

Хотя я знаю, как это сделать, используя monkeypatch на каждом тестовом уровне, я надеялся, что смогу просто сделать это как часть настройки/глобально каким-то образом.

Вот что я надеюсь, что я могу сделать (но я получаю сообщение об ошибке):

import logging 

... 

def setup(self, monkeypatch): 

    class fake_logger(level): 
        def __init__(self, val): 
            pass 

        def setLevel(self, level): 
            # Do something 

    def mock_logger(level): 
        return fake_logger(level) 
    monkeypatch.setattr(logging, 'getLogger', mock_logger) 

Что такое правильный способ сделать это?

РЕДАКТИРОВАТЬ: Пример ошибки

name = 'setup' 

def call_optional(obj, name): 
    method = getattr(obj, name, None) 
    isfixture = hasattr(method, "_pytestfixturefunction") 
    if method is not None and not isfixture and py.builtin.callable(method): 
     # If there's any problems allow the exception to raise rather than 
     # silently ignoring them 
>   method() 
E   TypeError: setup() missing 1 required positional argument: 'monkeypatch' 
+0

Пожалуйста, включите ошибки, которые вы получаете, это действительно помогает нам понять, что происходит не так. –

ответ

3

monkeypatch работает как обычный pytest приспособление. Если вы хотите использовать его, вам также нужно сделать свой метод в качестве приспособления.

import logging 

import pytest 


@pytest.fixture 
def setup(monkeypatch): 

    class fake_logger(object): 
     def __init__(self, val): 
      pass 

     def setLevel(self, level): 
      # Do something 
      pass 

    def mock_logger(level): 
     return fake_logger(level) 
    monkeypatch.setattr(logging, 'getLogger', mock_logger) 

def test_fake_logger(setup): 
    # test steps 

и если вы проверить тип logging.getLogger('any level') в тесте, это будет fake_logger вы определили.

+0

Вы также можете сделать '@ pytest.fixture (autouse = True)', поэтому он автоматически применяется для всех тестов, не имея аргумента 'setup'. –

 Смежные вопросы

  • Нет связанных вопросов^_^