如何使用Python MonkeyPatch + Mock断言某个函数已被调用

时间:2019-07-16 23:09:12

标签: mocking pytest monkeypatching

我有一个使用MonkeyPatch的测试库,用于测试某些功能。我想向该库添加一个测试,以测试对我的端点的请求调用了functionB()。

我已经使用Mock()库创建了模拟函数,然后使用MonkeyPatch.setattr()传递了该函数。但是,永远不会调用模拟函数,并且断言始终会失败。我在做什么错了?

    monkeypatch.setattr(file, 'function_B', mock_function_B)
    params = json.dumps({'foo': "bar"})
    res = client.post('/some_endpoint', headers=content_type_json, data=params)
    assert res.status_code == 201
    assert mock_function_B.call_count == 1

I expect call_count to be 1, as I know that some_endpoint calls function_B (and from the logs, I see that it has been called) However, the assertion fails because call_count is 0.

1 个答案:

答案 0 :(得分:1)

可以用不同的方式完成操作,例如,您可以模拟function_B并计算局部变量中的调用。

calls = []
monkeypatch.setattr(file, 'function_B', lambda a*, **k: calls.append('Called!'))
params = json.dumps({'foo': "bar"})
res = client.post('/some_endpoint', headers=content_type_json, data=params)
assert res.status_code == 201
assert len(calls) == 1