2016-02-25 1 views
1

Я использую mock с py.test для unittests.Как утверждать, что функция mock вызывается с помощью генератора?

Одна функция тестируемой выглядит как на картинке ниже:

def convert(rows): 
    rows = (preprocess(r) for r in rows) 
    return batch_process(True, rows) 

В тесте я бы издеваться preprocess и batch_process. Для preprocess я использую side_effect для настройки нескольких возвращаемых значений, по одному для каждой из строк.

Как утверждать, что второй аргумент, переданный batch_process, является генераторным выражением preprocess строк?

ответ

2

Рассмотрите возможность упрощения теста: то, что вам нужно проверить, состоит в том, что второй аргумент, когда он проходит через генератор, содержит значения, возвращаемые preprocess() для каждой строки.

я просто эскиз, как я могу в конце концов писать:

from mock import Mock, call 

preprocess_sentinels = [Mock() for _ in range(5)] 
mock_preprocess.side_effect = preprocess_sentinels 
rows = [Mock() for _ in range(5)] 

convert(rows) 

mock_preprocess.assert_has_calls([call(r) for r in rows]) 
args, kwargs = mock_batch_process.call_args 
assert args[0] 
for v, e in zip(args[1], preprocess_sentinels): 
    assert v == e 

Конечно, в этом случае вы не проверяют строго это генератор, но проверить convert() поведение. Проверьте, как именно вы его реализовали (по генератору или по списку) - это не то, что должен делать тест, это деталь реализации, а не поведение: вы должны написать лучший тест, который работает в обоих случаях.

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