[英]Why do I need to call my mock like a method?
我已經閱讀了有關Python 3和模擬的所有內容。 不幸的是,當我閱讀的所有文檔都使用后者時,我仍然無法弄清為什么我需要驗證對mock()
而不是mock
斷言。
這是我測試的樣子-
from unittest.mock import Mock, patch
from unittest import TestCase, skip
from suds.client import Client, ServiceDefinition
from run import WebService
import unittest
@patch('run.Client')
def test(self, mock):
service = WebService()
weather_id = 1234
weather = service.get_weather(weather_id)
mock().service.GetWeather.assert_called_once_with(weather_id)
在這種情況下run
是WebService
駐留的位置,而Client
是suds
客戶端。
打印我看到的mock.mock_calls
[
call('SERVICE_WSDL', proxy={'https': 'PROXY', 'http': 'PROXY'}),
call().factory.create('AuthHeader'),
call().set_options(soapheaders=<MagicMock name='Client().factory.create()' id='37553264'>),
call().service.GetWeather(1234, '', '')
]
提醒您,我的考試通過了。 我只是想知道我缺少什么,以便更好地了解Python中的模擬。
首先,讓我們重命名該變量,因為它實際上是run.Client
實例:
@patch('run.Client')
def test(self, mock_client):
# ...
mock_client().service.GetWeather.assert_called_once_with(weather_id)
您正在創建一個實例Client
內run
,而您使用的是在你的代碼。 但是您實際上並沒有在此測試中run.Client
該實例,而是在run.Client
類(正在修補run.Client
)。
因此,我們有一個模擬的類,並且正在調用該類來創建實例。 該實例是您的代碼實際使用的實例。 這意味着您真正想要的是訪問該類的構造函數的返回值:
mock_client.return_value.service.GetWeather.assert_called_once_with(weather_id)
這與您的代碼相同,只不過不調用mock_client()
。 您當前的測試代碼執行類似的操作:調用模擬類,查看返回的實例並對其進行斷言。 然而, mock
庫已經提供了return_value
屬性來做到這一點。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.