Python无法模拟API调用

时间:2019-10-06 16:53:57

标签: python mocking

我想模拟类方法在内部使用的api调用。

到目前为止,我已经拥有了:

@mock.patch("time.perf_counter", side_effect=lambda: 4)
def test_response_expiration(response_store):
    response_store.ttl = 2
    responses = [
        Response(status=200, url="foo", response_time=10, timestamp=1),
        Response(status=200, url="foo", response_time=10, timestamp=2),
    ]

    response_store.add(*responses) #add() uses time.perf_counter() internally 

问题是,当我打印respone_store时,我在stdout上看到以下内容:

 <MagicMock name='time' id='4455108176'> 

我不明白为什么会这样-为什么它会模拟出整个response_store对象?我希望它仅模拟time.perf_counter

我正在使用pytest

进行测试

1 个答案:

答案 0 :(得分:0)

从某种意义上讲,这并不是完全模拟整个response_store对象。装饰器将结果模拟从补丁传递到您的函数。由于您没有向其中添加其他参数,例如

@mock.patch("time.perf_counter", side_effect=lambda: 4)
def test_response_expiration(response_store, my_mock):
    ...

它将生成的补丁模拟分配给第一个参数response_store。因为它是模拟的,所以response_store的每次进一步使用或调用都会被该模拟的可塑性行为接受。