如何验证函数是否已被pytest击中

问题描述

我已经尝试过了:

def test_send_confirm_hit(monkeypatch):
    hit = False
    def called():
        global hit
        hit = True

    monkeypatch.setattr("web.email.send_confirm",called)

    # ... some event that will cause web.email.send_confirm to be hit

    assert hit  # verify send_confirm was hit

尽管我不想使用全局变量,但似乎可以使用。最好的方法是什么?

解决方法

如果您使用“适当的”模拟,它会附带一个.assert_called() method

import unittest.mock


def test_send_confirm_hit(monkeypatch):
    mock_send_confirm = unittest.mock.Mock()

    monkeypatch.setattr("web.email.send_confirm",mock_send_confirm)

    # ... some event that will cause web.email.send_confirm to be hit

    mock_send_confirm.assert_called()
,

您可以使用Mock代替函数:

from unittest.mock import MagicMock


def test_send_confirm_hit(monkeypatch):
    called = MagicMock()

    monkeypatch.setattr("web.email.send_confirm",called)

    # ... some event that will cause web.email.send_confirm to be hit

    assert called.call_count == 1  # verify send_confirm was hit

如果您确实需要执行一些自定义逻辑(例如对函数进行处理),则可以在模拟对象中添加side_effect

def test_send_confirm_hit(monkeypatch):
    def side_effect():
        return 42

    called = MagicMock(side_effect=side_effect)