2015-06-30 2 views
3

Я хочу, чтобы модульный тест утверждал, что переменная action внутри функции получает установленное значение до ее ожидаемого значения, единственный раз, когда эта переменная используется, когда она передается при вызове в библиотеку.Python unit test mock, получить входные аргументы функции focked

Class Monolith(object): 
    def foo(self, raw_event): 
     action = # ... Parse Event 
     # Middle of function 
     lib.event.Event(METADATA, action) 
     # Continue on to use the build event. 

Моя мысль была, что я мог издеваться lib.event.Event, и получить свои входные аргументы и утверждают, что они имеют определенное значение.

> Разве это не так, как работают макеты? Фальшивая документация расстраивает меня своей непоследовательностью, наполовину примерами и множеством примеров, которые не связаны с тем, что я хочу делать.

+0

где у используемых издеваетесь? вы можете mock 'lib.event.Event' и утверждать – vks

ответ

3

Вы можете использовать патч декоратора, а затем вызвать assert_called_with к этому издевались объектом:

Если у вас есть эта структура:

example.py 
tests.py 
lib/__init__.py 
lib/event.py 

и содержание example.py является:

import lib 

METADATA = 'metadata_example' 

class Monolith(object): 

    def foo(self, raw_event): 
     action = 'action_example' # ... Parse Event 
     # Middle of function 
     lib.event.Event(METADATA, action) 
     # Continue on to use the build event. 

И содержание Lib/event.py является:

class Event(object): 

    def __init__(self, metadata, action): 
     pass 

Код tests.py должен быть как:

import mock 
import unittest 

from lib.event import Event 
from example import Monolith 


class TestExample(unittest.TestCase): 

    @mock.patch('lib.event.Event') 
    def test_example1(self, event_mocked): 
     # Setup 
     m = Monolith() 

     # Exercise 
     m.foo('raw_event') 

     # Verify 
     event_mocked.assert_called_with('metadata_example', 'action_example') 
+0

что, если я хочу получить аргументы, переданные макету в качестве словаря? – dopatraman

+3

@dopatraman Вы можете использовать ['call_args'] (https://docs.python.org/3/library/unittest.mock.html#unittest.mock.Mock.call_args) или [' call_args_list'] (https: //docs.python.org/3/library/unittest.mock.html#unittest.mock.Mock.call_args_list). –

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