簡體   English   中英

為什么我需要像方法一樣調用我的模擬?

[英]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)

在這種情況下runWebService駐留的位置,而Clientsuds客戶端。

打印我看到的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)

您正在創建一個實例Clientrun ,而您使用的是在你的代碼。 但是您實際上並沒有在此測試中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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM