<p>你可以这样做:</p>
<pre><code>@patch.object(requests, 'post')
def test_service_post(mock_request_post):
data = {'number': 0000, 'user_id': 0, 'name': 'john'}
def res():
r = requests.Response()
r.status_code = 200
def json_func():
return data
r.json = json_func
return r
mock_request_post.return_value = res()
assert data == service_post(data)
</code></pre>
<p>当我在本地运行这个测试时,它通过了。<strong>注意Mock是一种很小的气味。</strong></p>
<p>我以前是<code>Mock</code>的超级粉丝。不过,随着我成长为一个开发人员,我真的努力避免它。它可以欺骗您进入一些非常糟糕的设计,并且它们很难维护(特别是因为您正在修改<code>Mock</code>来保存返回值)。^{prod1>你的服务可能会继续进行安全性测试(如果你的cd1的安全性测试通过的话)。我不认为你真的需要它。两种选择:</p>
<ol>
<li>你可以点击任何你想要点击的服务,然后用<code>pickle</code>序列化(保存)这个响应,然后存储到磁盘(保存在你的测试套件中)。然后让您的单元测试读回它并使用实际的响应对象。您仍然需要<code>patch</code>而不是<code>requests.post</code>,但至少返回值将为您排队,并且您不必随着需求/应用程序的增长而添加或修改它们。在</li>
<li>只要上网。完全忘掉<code>patch</code>:只需在测试中发布文章并检查响应。当然,这可能很慢,而且只有在你有互联网的情况下才有效。你会得到愚蠢的纯粹主义者,他们会告诉你不要在单元测试中这样做。如果你遇到一个纯粹的人,也许可以把它转移到一个集成测试中。但是说真的,在prod中做你真正要做的事情是没有替代品的,这样做的好处是,如果web服务发生了变化,那么你马上就会知道它并可以修改你的代码。缺点是它会减慢您的测试套件,而且它是一个潜在的不可靠的测试(如果web服务停止运行,您的测试将失败…但事实上知道这一点可能是很好的)。在</li>
</ol>
<p>我建议如果Web服务不稳定(即容易更改),请使用选项2。否则,使用选项1。或者组合使用(<code>Mock</code>和<code>patch</code>进行单元测试,并在集成测试中命中服务)。只有你能决定!在</p>
<p>祝你好运!在</p>