Python вызывающий макет с "=" не вызванным результатом - PullRequest
2 голосов
/ 13 марта 2019

Я пытаюсь смоделировать следующий вызов:

df_x = method() # returns a pandas dataframe
df_x.loc[df_x['atr'] < 0, 'atr'] = 0

Я смоделировал метод, чтобы он возвращал MagicMock и установил значение по умолчанию для атрибута __ getitem__ MagicMock следующим образом:

mock_df_x = mock_method.return_value
mock_df_x.__getitem__.return_value = 0

Проблема в том, что когда я пытаюсь подтвердить вызов:

mock_df_x.loc.__getitem__.assert_called_with(False, 'atr')

Я получаю функцию, которая не называется ошибкой.Если я вызываю такую ​​функцию без части "= 0", утверждение работает.

df_x.loc[df_x['atr'] < 0, 'atr']

1 Ответ

1 голос
/ 19 марта 2019

Причина, по которой вы видите это различное поведение в зависимости от того, есть ли у вас = 0 в конце вызова, который вы тестируете, заключается в том, что в модели данных Python они соответствуют двум различным магическим методам: __getitem__ и __setitem__.

Это имеет смысл, потому что, например, выполнение some_dictionary['nonexistent_key]' повышает KeyError, тогда как some_dictionary['nonexistent_key]' = 1 - нет, и устанавливает значение, как и ожидалось.

Теперь, чтобы исправить ваш тест, вам нужно всего лишь изменить свое утверждение с:

mock_df_x.loc.__getitem__.assert_called_with((False, 'atr'))

, который работает только при доступе к ключу:

mock_df_x.loc.__setitem__.assert_called_with((False, 'atr'), 0)

, который работает, если вы пытаетесь присвоить значение этой клавише. Обратите внимание и на дополнительный параметр, соответствующий значению, которое вы фактически пытаетесь присвоить.

...