2013-12-04 4 views
0

Мне нужно убедиться, что функция вызывается с определенным аргументом в python. Я издевался над этой функцией, используя магический макет.Mocking, assert_called with, in python

self.function = MagicMock() 
self.function(subject= "Hello World") 

что-то есть вдоль линий

self.function.assert_called_with("Hello World") 

или

self.function.assert_called_with(subject= "Hello World") 

Извините, если это было предложено до ли, но я ковыряться в макет документации и Безразлично Кажется, что ни одно из утверждений не будет работать для меня.

EDIT: Я добавил некоторые отладки вывод

При попытке отладки, я вижу

AssertionError: 
Expected call: mock('Hello World') 
Actual call: mock('thing i dont care about', 'Hello World', 'thing i dont care about') 

Таким образом, очевидно, что функция вызывается, но утверждают, действует странно. Он не распознает «Hello World» в списке аргументов или что-то в этом роде.

EDIT2:

Я изменил вверх мой код немного, и она по-прежнему не соответствует должным образом

self.function = MagicMock(field1 = None, field2 = None, subject = None, field4 = None) 

#later on... 
self.function(1,2,"Hello World",4) #these params will not always be 1,2,4 .. I made them so to 
            #show an example 

#even further down the road 
self.function.assert_called_with(ANY, ANY, "Hello World", ANY) 

Что-то вроде этого не работает для меня тоже. Тем не менее получаю ошибку

AssertionError: 
Expected call: mock(<ANY>, <ANY>, "Hello World", <ANY>) 
Actual call: mock(1,2,"Hello World", 4) 

Опять же, я не мог просто сделать что-то вроде

Как «ANY» соответствуют шаблону аргумент?

+0

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

+0

в чем проблема? код работает. – alko

+0

Мне нужно что-то, что обнаружит один параметр, из нескольких. Вещь, о которой говорится, что макет называется с mock («First Thing», «Second Thing», «Hello World» и т. Д.) , что означает, что это не соответствует моей теме. – Zack

ответ

0

То, что вы написали, прекрасно работает так, как вы предполагали. Вынимая самооценку, здесь приведен упрощенный вариант:

func = mock.MagicMock() 
func(subject="Hello World") 
# assert that func was indeed called with subject="Hello World" 
# this goes well since it was indeed called with "Hello World" 
func.assert_called_with(subject="Hello World") 
# this fails since func was not called with "Bye World" 
AssertionError: Expected call: mock(subject='Bye World') 
Actual call: mock(subject='Hello World') 
# The mock also distinguishes between calls with positional and keyword arguments 
# so func(subject="Hello World") is not same as func("Hello World") w.r.t. 
# the assert statements 

Это то, что ожидается. Так что если вы хотите, чтобы убедиться, что макет функция была действительно вызвана с ожидаемыми аргументами, просто потребительной

func(key=<args>) 
func.assert_called_with(key=<args>) 

или

func(<args>) 
func.assert_called_with(<args>) 

Просто помните, чтобы соответствовать сигнатуре функции в вызове и утверждать.