Python单元测试assert_used_with() false,尽管调用相同

标签 python python-unittest

我正在调用 unittest 的 Mock.assert_used_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_used_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

关于Python单元测试assert_used_with() false,尽管调用相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55007824/

相关文章:

python - PyQt 和 PySide 等成熟的软件包的术语是什么?

python - 以编程方式在 pytest 插件中注册固定装置

python - 为什么打印制表符并不总是打印制表符而是打印空格?

python - 导入错误 : cannot import name wraps

python - "RuntimeError: working outside of application context"使用 py.test 进行单元测试时

Python Flask unittest 无法为 GET 请求设置 header

python - 如何用 Nose 测试命令行脚本?

python - 通过在 python 中使用 argparse 从我的模块传递其命令行参数来调用另一个模块

python - 删除重复项,但忽略空值

python - Django 找不到我的媒体文件(在开发服务器上)