如何用pytest验证一个函数是否命中

How to verify whether a function has been hit with 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)