簡體   English   中英

盡管調用相同,Python unittest assert_call_with()為false

[英]Python unittest assert_called_with() false, despite identical calls

我正在調用unittest的Mock.assert_drawn_with(),並且在預期的調用和實際的調用似乎相同的情況下,出現以下錯誤。 (差異顯示沒有差異。)這是預期的行為嗎? 有什么建議么?

錯誤:

E           AssertionError: Expected call: tabular_learner(<MagicMock name='TabularList.from_df().split_by_idx().label_from_df().databunch()' id='139820374227096'>, callback_fns=[functools.partial(<class 'fastai.callbacks.tracker.TrackerCallback'>, monitor='exp_rmspe'), functools.partial(<class 'fastai.callbacks.tracker.EarlyStoppingCallback'>, mode='min', monitor='exp_rmspe', min_delta=0.01, patience=1), functools.partial(<class 'fastai.callbacks.tracker.SaveModelCallback'>, monitor='exp_rmspe', mode='min', every='improvement', name='2019-03-05-16:32:30')], emb_drop=0.01, layers=[100, 100], metrics=<function exp_rmspe at 0x7f2a79504488>, ps=[0.001, 0.01], y_range=None)
E           Actual call: tabular_learner(<MagicMock name='TabularList.from_df().split_by_idx().label_from_df().databunch()' id='139820374227096'>, callback_fns=[functools.partial(<class 'fastai.callbacks.tracker.TrackerCallback'>, monitor='exp_rmspe'), functools.partial(<class 'fastai.callbacks.tracker.EarlyStoppingCallback'>, mode='min', monitor='exp_rmspe', min_delta=0.01, patience=1), functools.partial(<class 'fastai.callbacks.tracker.SaveModelCallback'>, monitor='exp_rmspe', mode='min', every='improvement', name='2019-03-05-16:32:30')], emb_drop=0.01, layers=[100, 100], metrics=<function exp_rmspe at 0x7f2a79504488>, ps=[0.001, 0.01], y_range=None)

測試代碼(這是最后一個assert_Called_with失敗):

@patch('src.models.preprocess.preprocess')
@patch('src.models.preprocess.gather_args')
@patch('src.models.train_model.TabularList')
@patch('src.models.train_model.tabular_learner')
def test_get_pred_new_model_calls_pt1(self, mock_tabular_learner,
                                      mock_tabular_list,
                                      mock_gather_args, mock_preprocess):
    """The data should be processed, the model run, and the new accuracy
    calculated.
    """
    with self.assertRaises(ValueError):
        # It raises because we don't pass enough info to 'learn' to call
        # .get_preds()
        train_model.get_new_model_and_pred(train_df=self.df[:2],
                                           valid_df=self.df[2:],
                                           path=self.model_path)
    mock_preprocess.assert_called()
    mock_gather_args.assert_called()
    mock_tabular_list.from_df.assert_called_with(mock_preprocess(),
        path=self.model_path,
        procs=mock_gather_args()['procs'],
        cat_names=mock_gather_args()['cat_names'],
        cont_names=mock_gather_args()['cont_names'])
    mock_tabular_learner.assert_called()
    mock_tabular_learner.assert_called_with(
        mock_tabular_list.from_df().split_by_idx().label_from_df().
        databunch(),
        layers=[100, 100],
        ps=[0.001, 0.01],
        emb_drop=0.01,
        metrics=exp_rmspe,
        y_range=None,
        callback_fns=[partial(callbacks.tracker.TrackerCallback,
                              monitor='exp_rmspe'),
                      partial(callbacks.tracker.EarlyStoppingCallback,
                              mode='min', monitor='exp_rmspe',
                              min_delta=0.01, patience=1),
                      partial(callbacks.tracker.SaveModelCallback,
                              monitor='exp_rmspe', mode='min',
                              every='improvement',
                              name=
                              datetime.now().strftime("%Y-%m-%d-%X"))])

如果您對回調函數是否相等不感興趣,則可以為斷言中的特定參數提供unittest.mock.ANY 例如:

from unittest.mock import ANY

...

mock_tabular_learner.assert_called_with(
    mock_tabular_list.from_df().split_by_idx().label_from_df().
    databunch(),
    layers=[100, 100],
    ps=[0.001, 0.01],
    emb_drop=0.01,
    metrics=exp_rmspe,
    y_range=None,
    callback_fns=ANY)  # We don't care about the callback functions

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM