在测试中嘲笑睡眠

mocking sleep in a test

我有一个要测试的函数,它最终会调用另一个函数,其中有一些 time.sleep 函数。我不想让我的测试休眠。所以,我的问题是,是模拟测试函数更好,还是包装我对函数的调用以使用补丁进行测试?

示例 1

@patch('time.sleep')
def test_some_function(mock_time):
    data = some_sleepy_function()
    assert data == expected_data

示例 2:

def test_some_function():
    @patch('time.sleep')
    def run_function(mock_sleep):
        return some_sleepy_function()
    assert run_function() == expected_data

为了模拟像 time.sleep 这样简单的东西,我会使用 py.test 的 monkeypatch:

def test_some_function(monkeypatch):
    monkeypatch.setattr(time, 'sleep', lambda s: None)
    data = some_sleepy_function()
    assert data == expected_data

如果您将测试分组在 class 中:

class Test:

    def test_some_function(self, monkeypatch):
        monkeypatch.setattr(time, 'sleep', lambda s: None)
        data = some_sleepy_function()
        assert data == expected_data   

请注意,这仅对 "standard" pytest classes 有效(不适用于 unittest.TestCase subclasses)。

在我看来,将 mock.patch 作为装饰器与 pytest 一起使用是令人困惑的,因为 py.test 的固定装置作为参数传递给测试函数。