Проверьте параметры функции фиктивного вызова

#python #unit-testing #mocking

Вопрос:

Я разрабатываю модульные тесты для унаследованного метода, который будет меняться на основе сигнатур вызовов из исходной модели. В настоящее время у меня возникли проблемы с разработкой имитационного вызова и проверкой.getfullargspec.

Для небольшого фона, если используется модель Keras, метод вызова принимает inputs , training=None , и mask=None (ссылка). Однако, если пользователь передает что-то вроде TFBertForSequenceClassification (наследование от tf.keras.Модель) требуется другой набор аргументов. Например input_ids=None , attention_mask=None , token_type_ids=None , и т. д

Текущая функция, с которой я работаю, приведена ниже.

   def _call_original_model(self, inputs, training=None, mask=None):
    """Calls the original model with appropriate args."""
    arg_tuples = [("training", training,
                   self.original_model._expects_training_arg)]

    # Check if the original model call signature uses "mask" and pass mask to
    # the original model if present.
    if "mask" in inspect.getfullargspec((self.original_model.call)):
      arg_tuples.append(("mask", mask, self.original_model._expects_mask_arg))

    kwargs = {name: value for name, value, expected in arg_tuples if expected}
    return self.original_model(inputs, **kwargs)
 

Хотя приведенное ниже не полностью разработано для принятия подписи вызова чего-то вроде TFBertForSequenceClassification, я пытаюсь издеваться над вызовом, который пытается только добавить mask .

— Теперь к вопросу:

В частности, я пытаюсь понять, как издеваться inspect.getfullargspec над частью вышеупомянутого метода. Например, что-то вроде приведенного ниже (обратите внимание, что текущий макет магии выдает ошибку, но вы поняли идею).

 model = tf.keras.Model()
model.call(inputs='foo', mask='bar') = mock.MagicMock()
_ = _call_original_model(model, mask='mask')
model.call.assert_called_once_with(inputs, mask='mask')
 

В настоящее время передача mock.MagicMock() в качестве функции вызова выведет следующее, что в настоящее время не выполняется, так как в MagicMock нет mask :

 >>> inspect.getfullargspec((model.call))
FullArgSpec(args=['_mock_self'], varargs='args', varkw='kwargs', defaults=None, kwonlyargs=[], kwonlydefaults=None, annotations={})
 

Хотелось бы услышать любые мысли о том, как издеваться над приемлемыми параметрами.

Заранее большое спасибо!

Комментарии:

1. не весь этот код имеет для меня смысл. Как будто вы передаете tf.keras.Model() объект _call_original_model , но он ожидает чего-то, что имеет original_model атрибут [которого tf.keras.Model() нет]. Кроме того, я вижу, что вы пытаетесь издеваться model.call , пытаясь присвоить результат вызова этому методу. Но если ваш вопрос только в том , как издеваться inspect.getfullargspec , то вы пробовали его исправить ?