最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python如何在單元測(cè)試中給對(duì)象打補(bǔ)丁

 更新時(shí)間:2020年08月03日 11:11:21   作者:David Beazley  
這篇文章主要介紹了Python如何在單元測(cè)試中給對(duì)象打補(bǔ)丁,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下

問(wèn)題

你寫的單元測(cè)試中需要給指定的對(duì)象打補(bǔ)丁, 用來(lái)斷言它們?cè)跍y(cè)試中的期望行為(比如,斷言被調(diào)用時(shí)的參數(shù)個(gè)數(shù),訪問(wèn)指定的屬性等)。

解決方案

unittest.mock.patch() 函數(shù)可被用來(lái)解決這個(gè)問(wèn)題。 patch() 還可被用作一個(gè)裝飾器、上下文管理器或單獨(dú)使用,盡管并不常見(jiàn)。 例如,下面是一個(gè)將它當(dāng)做裝飾器使用的例子:

from unittest.mock import patch
import example

@patch('example.func')
def test1(x, mock_func):
  example.func(x)    # Uses patched example.func
  mock_func.assert_called_with(x)

它還可以被當(dāng)做一個(gè)上下文管理器:

with patch('example.func') as mock_func:
  example.func(x)   # Uses patched example.func
  mock_func.assert_called_with(x)

最后,你還可以手動(dòng)的使用它打補(bǔ)?。?/p>

p = patch('example.func')
mock_func = p.start()
example.func(x)
mock_func.assert_called_with(x)
p.stop()

如果可能的話,你能夠疊加裝飾器和上下文管理器來(lái)給多個(gè)對(duì)象打補(bǔ)丁。例如:

@patch('example.func1')
@patch('example.func2')
@patch('example.func3')
def test1(mock1, mock2, mock3):
  ...

def test2():
  with patch('example.patch1') as mock1, \
     patch('example.patch2') as mock2, \
     patch('example.patch3') as mock3:
  ...

討論

patch() 接受一個(gè)已存在對(duì)象的全路徑名,將其替換為一個(gè)新的值。 原來(lái)的值會(huì)在裝飾器函數(shù)或上下文管理器完成后自動(dòng)恢復(fù)回來(lái)。 默認(rèn)情況下,所有值會(huì)被 MagicMock 實(shí)例替代。例如:

>>> x = 42
>>> with patch('__main__.x'):
...   print(x)
...
<MagicMock name='x' id='4314230032'>
>>> x
42
>>>

不過(guò),你可以通過(guò)給 patch() 提供第二個(gè)參數(shù)來(lái)將值替換成任何你想要的:

>>> x
42
>>> with patch('__main__.x', 'patched_value'):
...   print(x)
...
patched_value
>>> x
42
>>>

被用來(lái)作為替換值的 MagicMock 實(shí)例能夠模擬可調(diào)用對(duì)象和實(shí)例。 他們記錄對(duì)象的使用信息并允許你執(zhí)行斷言檢查,例如:

>>> from unittest.mock import MagicMock
>>> m = MagicMock(return_value = 10)
>>> m(1, 2, debug=True)
10
>>> m.assert_called_with(1, 2, debug=True)
>>> m.assert_called_with(1, 2)
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
 File ".../unittest/mock.py", line 726, in assert_called_with
  raise AssertionError(msg)
AssertionError: Expected call: mock(1, 2)
Actual call: mock(1, 2, debug=True)
>>>

>>> m.upper.return_value = 'HELLO'
>>> m.upper('hello')
'HELLO'
>>> assert m.upper.called

>>> m.split.return_value = ['hello', 'world']
>>> m.split('hello world')
['hello', 'world']
>>> m.split.assert_called_with('hello world')
>>>

>>> m['blah']
<MagicMock name='mock.__getitem__()' id='4314412048'>
>>> m.__getitem__.called
True
>>> m.__getitem__.assert_called_with('blah')
>>>

一般來(lái)講,這些操作會(huì)在一個(gè)單元測(cè)試中完成。例如,假設(shè)你已經(jīng)有了像下面這樣的函數(shù):

# example.py
from urllib.request import urlopen
import csv

def dowprices():
  u = urlopen('http://finance.yahoo.com/d/quotes.csv?s=@^DJI&f=sl1')
  lines = (line.decode('utf-8') for line in u)
  rows = (row for row in csv.reader(lines) if len(row) == 2)
  prices = { name:float(price) for name, price in rows }
  return prices

正常來(lái)講,這個(gè)函數(shù)會(huì)使用 urlopen() 從Web上面獲取數(shù)據(jù)并解析它。 在單元測(cè)試中,你可以給它一個(gè)預(yù)先定義好的數(shù)據(jù)集。下面是使用補(bǔ)丁操作的例子:

import unittest
from unittest.mock import patch
import io
import example

sample_data = io.BytesIO(b'''\
"IBM",91.1\r
"AA",13.25\r
"MSFT",27.72\r
\r
''')

class Tests(unittest.TestCase):
  @patch('example.urlopen', return_value=sample_data)
  def test_dowprices(self, mock_urlopen):
    p = example.dowprices()
    self.assertTrue(mock_urlopen.called)
    self.assertEqual(p,
             {'IBM': 91.1,
             'AA': 13.25,
             'MSFT' : 27.72})

if __name__ == '__main__':
  unittest.main()

本例中,位于 example 模塊中的 urlopen() 函數(shù)被一個(gè)模擬對(duì)象替代, 該對(duì)象會(huì)返回一個(gè)包含測(cè)試數(shù)據(jù)的 ByteIO()

還有一點(diǎn),在打補(bǔ)丁時(shí)我們使用了 example.urlopen 來(lái)代替 urllib.request.urlopen 。 當(dāng)你創(chuàng)建補(bǔ)丁的時(shí)候,你必須使用它們?cè)跍y(cè)試代碼中的名稱。 由于測(cè)試代碼使用了 from urllib.request import urlopen ,那么 dowprices() 函數(shù) 中使用的 urlopen() 函數(shù)實(shí)際上就位于 example 模塊了。

本節(jié)實(shí)際上只是對(duì) unittest.mock 模塊的一次淺嘗輒止。 更多更高級(jí)的特性,請(qǐng)參考 官方文檔

以上就是Python如何在單元測(cè)試中給對(duì)象打補(bǔ)丁的詳細(xì)內(nèi)容,更多關(guān)于Python 單元測(cè)試的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • python基礎(chǔ)之reverse和reversed函數(shù)的介紹及使用

    python基礎(chǔ)之reverse和reversed函數(shù)的介紹及使用

    我們?cè)谡碣Y料的時(shí)候,有的時(shí)候過(guò)于混亂難以整理,這時(shí)我們不妨可以對(duì)它先進(jìn)行一個(gè)排序,這樣可以方便我們?yōu)g覽,查詢,有利于我們整理資料,下面這篇文章主要給大家介紹了關(guān)于python基礎(chǔ)之reverse和reversed函數(shù)的介紹及使用,需要的朋友可以參考下
    2022-12-12
  • 對(duì)pandas寫入讀取h5文件的方法詳解

    對(duì)pandas寫入讀取h5文件的方法詳解

    今天小編就為大家分享一篇對(duì)pandas寫入讀取h5文件的方法詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-12-12
  • 基于Python繪制520表白代碼

    基于Python繪制520表白代碼

    這周五就是520,大家都準(zhǔn)備好送給女朋友的禮物了嗎?快來(lái)利用Python編寫個(gè)表白代碼送給她吧!文中示例代碼講解詳細(xì),跟隨小編一起動(dòng)手試一試吧
    2022-05-05
  • 查看keras各種網(wǎng)絡(luò)結(jié)構(gòu)各層的名字方式

    查看keras各種網(wǎng)絡(luò)結(jié)構(gòu)各層的名字方式

    這篇文章主要介紹了查看keras各種網(wǎng)絡(luò)結(jié)構(gòu)各層的名字方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-06-06
  • APIStar:一個(gè)專為Python3設(shè)計(jì)的API框架

    APIStar:一個(gè)專為Python3設(shè)計(jì)的API框架

    今天小編就為大家分享一篇關(guān)于一個(gè)專為Python3設(shè)計(jì)的API框架:APIStar,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2018-09-09
  • Django開發(fā)中使用Ueditor上傳圖片遇到的坑及解決

    Django開發(fā)中使用Ueditor上傳圖片遇到的坑及解決

    在Django開發(fā)中使用Ueditor上傳圖片時(shí),可能會(huì)遇到后端配置不正確的問(wèn)題,建議在實(shí)例化Ueditor后加上serverUrl,這可以在Chrome的F12工具中查看請(qǐng)求的后端配置項(xiàng),此外,如果需要修改上傳路徑,可以在配置文件中更改路徑,并調(diào)整view.py中的代碼來(lái)管理上傳文件
    2024-09-09
  • 教你如何利用Python批量翻譯英文Word文檔并保留格式

    教你如何利用Python批量翻譯英文Word文檔并保留格式

    本文將給大家分享一個(gè)實(shí)用的Python辦公自動(dòng)化腳本 利用Python批量翻譯英文Word文檔并保留格式,最終效果甚至比部分收費(fèi)的軟件還要好!文中有非常詳細(xì)的代碼示例.需要的朋友可以參考下
    2021-05-05
  • python生成1行四列全2矩陣的方法

    python生成1行四列全2矩陣的方法

    今天小編就為大家分享一篇python生成1行四列全2矩陣的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-08-08
  • Python配置文件管理之ini和yaml文件讀取的實(shí)現(xiàn)

    Python配置文件管理之ini和yaml文件讀取的實(shí)現(xiàn)

    本文主要介紹了Python配置文件管理之ini和yaml文件讀取,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • 如何用Python合并lmdb文件

    如何用Python合并lmdb文件

    這篇文章主要為大家詳細(xì)介紹了如何用Python合并lmdb文件,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-07-07

最新評(píng)論

定结县| 沙田区| 台州市| 天津市| 曲阳县| 汉寿县| 宿松县| 丰原市| 修文县| 大冶市| 镇巴县| 平山县| 额尔古纳市| 东辽县| 桃源县| 勐海县| 元氏县| 安宁市| 沙田区| 武义县| 辽阳市| 尼勒克县| 呼和浩特市| 清水河县| 海安县| 临夏县| 汉阴县| 台湾省| 连江县| 甘德县| 上犹县| 云南省| 大兴区| 都江堰市| 当阳市| 定州市| 英德市| 客服| 仪征市| 乐业县| 唐海县|