Поддельный метод, который импортируется в тестируемый модуль - PullRequest
1 голос
/ 02 февраля 2012

Скажите, что я хочу проверить этот модуль:

import osutils

def check_ip6(xml):
  ib_output = osutils.call('iconfig ib0')
  # process and validate ib_output (to be unit tested)
  ...

Этот метод зависит от среды, поскольку он выполняет системный вызов (который ожидает определенный сетевой интерфейс), поэтому его нельзя вызывать на тестовой машине.

Я хочу написать модульный тест для этого метода, который проверяет, работает ли обработка ib_output, как ожидалось. Поэтому я хочу высмеять osutils.call и позволить ему просто вернуть тестовые данные. Каков предпочтительный способ сделать это? Должен ли я делать насмешки или (обезьяньи) исправления?

Пример теста:

def test_ib6_check():
    from migration import check_ib6
    # how to mock os_utils.call used by the check_ib6-method?
    assert check_ib6(test_xml) == True

Ответы [ 2 ]

1 голос
/ 02 февраля 2012

Одним из решений было бы сделать from osutils import call, а затем при исправлении вещей заменить yourmodule.call чем-то другим перед вызовом test_ib6_check.

0 голосов
/ 02 февраля 2012

Хорошо, я обнаружил, что это не имеет ничего общего с mocks, afaik, мне просто нужен патч обезьяны: мне нужно импортировать и изменить osutils.call -метод, а затем импортировать тестируемый метод (а НЕ весь модуль). , поскольку он затем импортирует исходный метод вызова). Тогда этот метод будет использовать мой измененный метод вызова:

def test_ib6_check():
    def call_mock(cmd):
        return "testdata"    
    osutils.call = call_mock
    from migration import check_ib6
    # the check_ib6 now uses the mocked method
    assert check_ib6(test_xml) == True
...