#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
, то вы пробовали его исправить ?