2012-02-02 3 views
1

Скажите, что я хочу, чтобы проверить этот модуль:Mock метод, который импортируется в модуль испытываемого

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 и позволить ему просто вернуть testdata. Каков предпочтительный способ сделать это? Нужно ли мне делать издевательства или (обезьяна)?

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

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 

ответ

1

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

0

Хорошо, я выяснил, что это не имеет ничего общего с 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 
Смежные вопросы