成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Python中Mock的示例

elva / 780人閱讀

摘要:一些常用的示例先簡(jiǎn)單定義個(gè)類,方便舉例這個(gè)類里有兩個(gè)成員方法,一個(gè)有參數(shù),一個(gè)無(wú)參數(shù)。有個(gè)模塊方法,返回?cái)?shù)據(jù)庫(kù)中所有指定的人員,并按排序掉整個(gè)數(shù)據(jù)庫(kù)訪問(wèn)先得到一個(gè)的對(duì)象,再在中設(shè)置一個(gè)對(duì)象,此時(shí)不需要自己再創(chuàng)建

一些常用的mock示例

先簡(jiǎn)單定義個(gè)類,方便舉例:

class Person:
    def __init__(self):
        self.__age = 10
        
    def get_fullname(self, first_name, last_name):
        return first_name + " " + last_name
        
    def get_age(self):
        return self.__age
        
    @staticmethod
    def get_class_name():
        return Person.__name__

這個(gè)類里有兩個(gè)成員方法,一個(gè)有參數(shù),一個(gè)無(wú)參數(shù)。還有一個(gè)靜態(tài)方法


mock成員方法
1. 使用Mock類,返回固定值
class PersonTest(TestCase):
    def test_should_get_age(self):
        p = Person()
        
        # 不mock時(shí),get_age應(yīng)該返回10
        self.assertEqual(p.get_age(), 10)
        
        # mock掉get_age方法,讓它返回20
        p.get_age = Mock(return_value=20)
        self.assertEqual(p.get_age(), 20)
    
    def test_should_get_fullname(self):
        p = Person()
        
        # mock掉get_fullname,讓它返回"James Harden"
        p.get_fullname = Mock(return_value="James Harden")
        self.assertEqual(p.get_fullname(), "James Harden")
2. 校驗(yàn)參數(shù)個(gè)數(shù),再返回固定值

上面的例子你也許已經(jīng)注意到了,調(diào)用p.get_fullname時(shí)沒(méi)有給任何的參數(shù),但是依然可以工作。
如果想校驗(yàn)參數(shù)需要用create_autospec模塊方法替代Mock類。

class PersonTest(TestCase):
    def test_should_get_fullname(self):
        p = Person()
        
        p.get_fullname = create_autospec(p.get_fullname, return_value="James Harden")
        
        # 隨便給兩個(gè)參數(shù),依然會(huì)返回mock的值
        self.assertEqual(p.get_fullname("1", "2"), "James Harden") 
        
        # 如果參數(shù)個(gè)數(shù)不對(duì),會(huì)報(bào)錯(cuò)TypeError: missing a required argument: "last_name"
        p.get_fullname("1")
3. 使用side_effect, 依次返回指定值
class PersonTest(TestCase):
    def test_should_get_age(self):
        p = Person()
        
        p.get_age = Mock(side_effect=[10, 11, 12])

        self.assertEqual(p.get_age(), 10)
        self.assertEqual(p.get_age(), 11)
        self.assertEqual(p.get_age(), 12)
4. 根據(jù)參數(shù)不同,返回不同的值
class PersonTest(TestCase):
    def test_should_get_fullname(self):
        p = Person()
        
        values = {("James", "Harden"): "James Harden", ("Tracy", "Grady"): "Tracy Grady"}
        p.get_fullname = Mock(side_effect=lambda x, y: values[(x, y)])
        
        self.assertEqual(p.get_fullname("James", "Harden"), "James Harden")
        self.assertEqual(p.get_fullname("Tracy", "Grady"), "Tracy Grady")
5. 拋出異常
class PersonTest(TestCase):
    def test_should_raise_exception(self):
        p = Person()
        
        p.get_age = Mock(side_effect=TypeError("integer type"))
        # 只要調(diào)就會(huì)拋出異常
        self.assertRaises(TypeError, p.get_age)
6. 檢驗(yàn)是否調(diào)用
class PersonTest(TestCase):
    def test_should_validate_method_calling(self):
        p.get_fullname = Mock(return_value="James Harden")

        # 沒(méi)調(diào)用過(guò)
        p.get_fullname.assert_not_called()  # Python 3.5

        p.get_fullname("1", "2")

        # 調(diào)用過(guò)任意次數(shù)
        p.get_fullname.assert_called() # Python 3.6
        # 只調(diào)用過(guò)一次, 不管參數(shù)
        p.get_fullname.assert_called_once() # Python 3.6
        # 只調(diào)用過(guò)一次,并且符合指定的參數(shù)
        p.get_fullname.assert_called_once_with("1", "2")

        p.get_fullname("3", "4")
        # 只要調(diào)用過(guò)即可,必須指定參數(shù)
        p.get_fullname.assert_any_call("1", "2")

        # 重置mock,重置之后相當(dāng)于沒(méi)有調(diào)用過(guò)
        p.get_fullname.reset_mock()
        p.get_fullname.assert_not_called()
        
        # Mock對(duì)象里除了return_value, side_effect屬性外,
        # called表示是否調(diào)用過(guò),call_count可以返回調(diào)用的次數(shù)
        self.assertEqual(p.get_fullname.called, False)
        self.assertEqual(p.get_fullname.call_count, 0)
        
        p.get_fullname("1", "2")
        p.get_fullname("3", "4")
        self.assertEqual(p.get_fullname.called, True)
        self.assertEqual(p.get_fullname.call_count, 2)
mock靜態(tài)方法

靜態(tài)方法和模塊方法需要使用patch來(lái)mock。

1. 在測(cè)試方法參數(shù)中得到Mock對(duì)象
class PersonTest(TestCase):
    # 以字符串的形式列出靜態(tài)方法的路徑,在測(cè)試的參數(shù)里會(huì)自動(dòng)得到一個(gè)Mock對(duì)象
    @patch("your.package.module.Person.get_class_name")
    def test_should_get_class_name(self, mock_get_class_name):
        mock_get_class_name.return_value = "Guy"

        self.assertEqual(Person.get_class_name(), "Guy")
2. 在patch中設(shè)置Mock對(duì)象
class PersonTest(TestCase):
    mock_get_class_name = Mock(return_value="Guy")

    # 在patch中給出定義好的Mock的對(duì)象,好處是定義好的對(duì)象可以復(fù)用
    @patch("your.package.module.Person.get_class_name", mock_get_class_name)
    def test_should_get_class_name(self):
        self.assertEqual(Person.get_class_name(), "Guy")
3. 使用patch.object
class PersonTest(TestCase):
    mock_get_class_name = Mock(return_value="Guy")

    # 使用patch.object來(lái)mock,好處是Person類不是以字符串形式給出的
    @patch.object(Person, "get_class_name", mock_get_class_name)
    def test_should_get_class_name(self, ):
        self.assertEqual(Person.get_class_name(), "Guy")
4. 使用with控制作用域
class PersonTest(TestCase):
    # 作用域之外,依然返回真實(shí)值
    def test_should_get_class_name(self, ):
        mock_get_class_name = Mock(return_value="Guy")
        with patch("your.package.module.Person.get_class_name", mock_get_class_name):
            self.assertEqual(Person.get_class_name(), "Guy")

        self.assertEqual(Person.get_class_name(), "Person")
mock鏈?zhǔn)秸{(diào)用

在django里,我們經(jīng)常需要mock數(shù)據(jù)庫(kù),而訪問(wèn)數(shù)據(jù)庫(kù)時(shí)經(jīng)常是鏈?zhǔn)秸{(diào)用,看個(gè)例子。

def get_person(name):
    return Person.objects.filter(name=name).order_by("age")

有個(gè)模塊方法,返回?cái)?shù)據(jù)庫(kù)中所有指定name的人員,并按age排序

mock掉整個(gè)數(shù)據(jù)庫(kù)訪問(wèn)

@patch("your.package.module.Person.objects.filter")
def test_should_get_person(self, mock_filter):
    # 先得到一個(gè)filter的Mock對(duì)象,再在return_value中設(shè)置一個(gè)Mock對(duì)象,此時(shí)不需要自己再創(chuàng)建
    mock_filter.return_value.order_by.return_value = None
    
    self.assertIsNone(get_person())

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/45535.html

相關(guān)文章

  • 代碼測(cè)試用例指南

    摘要:測(cè)試的通用規(guī)則測(cè)試單元應(yīng)該集中于小部分的功能,并且證明它是對(duì)的。通過(guò)去除依賴盡量使測(cè)試單元快速運(yùn)行。實(shí)現(xiàn)來(lái)持續(xù)集成通過(guò)代碼提交的本地或者來(lái)持續(xù)集成測(cè)試你的代碼。 原文鏈接:http://blog.speedx.com/backend-test-guide 將測(cè)試代碼和運(yùn)行代碼一起寫是一種非常好的習(xí)慣。聰明地使用這種方法將會(huì)幫助你更加精確地定義代碼的含義,并且代碼的耦合性更低。 測(cè)試的通...

    chinafgj 評(píng)論0 收藏0
  • Python單元測(cè)試

    摘要:每個(gè)測(cè)試方法的名稱以單詞開頭,單元測(cè)試是如何識(shí)別它們是測(cè)試的。它還意味著知道測(cè)試文件中有多少單元測(cè)試,而不是簡(jiǎn)單地知道有多少表達(dá)式您可能已經(jīng)注意到將每個(gè)行作為單獨(dú)的測(cè)試計(jì)數(shù)。 showImg(https://segmentfault.com/img/remote/1460000019140153); 來(lái)源 | 愿碼(ChainDesk.CN)內(nèi)容編輯 愿碼Slogan | 連接每個(gè)程...

    Heier 評(píng)論0 收藏0
  • Python Mock入門

    摘要:準(zhǔn)確的說(shuō),是中一個(gè)用于支持單元測(cè)試的庫(kù),它的主要功能是使用對(duì)象替代掉指定的對(duì)象,以達(dá)到模擬對(duì)象的行為。下面我們使用對(duì)象在單元測(cè)試中分別測(cè)試訪問(wèn)正常和訪問(wèn)不正常的情況。 Mock是什么 Mock這個(gè)詞在英語(yǔ)中有模擬的這個(gè)意思,因此我們可以猜測(cè)出這個(gè)庫(kù)的主要功能是模擬一些東西。準(zhǔn)確的說(shuō),Mock是Python中一個(gè)用于支持單元測(cè)試的庫(kù),它的主要功能是使用mock對(duì)象替代掉指定的Python...

    Winer 評(píng)論0 收藏0
  • Python 模擬測(cè)試介紹

    摘要:接下來(lái)我們將介紹如何對(duì)對(duì)象的方法進(jìn)行模擬測(cè)試。選項(xiàng)創(chuàng)建模擬測(cè)試接口我們可以在的構(gòu)造函數(shù)中提供一個(gè)模擬測(cè)試實(shí)例,而不是模擬創(chuàng)建具體的模擬測(cè)試方法。 如何不靠耐心測(cè)試 通常,我們編寫的軟件會(huì)直接與那些我們稱之為骯臟的服務(wù)交互。通俗地說(shuō),服務(wù)對(duì)我們的應(yīng)用來(lái)說(shuō)是至關(guān)重要的,它們之間的交互是我們?cè)O(shè)計(jì)好的,但這會(huì)帶來(lái)我們不希望的副作用——就是那些在我們自己測(cè)試的時(shí)候不希望的功能。 比如,可能我們...

    BearyChat 評(píng)論0 收藏0
  • PythonMock和MagicMock區(qū)別

    摘要:也就是說(shuō),如果不需要,兩者使用起來(lái)并沒(méi)有什么分別。來(lái)看個(gè)例子,先定義個(gè)類,里面只有一個(gè)成員方法,返回倍的數(shù)值使用類來(lái)掉這個(gè)成員方法使用類來(lái)兩者沒(méi)有任何區(qū)別,都成功了了成員方法。再看下兩者的區(qū)別因?yàn)槭褂妙悤r(shí),默認(rèn)不會(huì)創(chuàng)建這個(gè)的,所以報(bào)錯(cuò)。 Python的unittest.mock模塊中提供了兩個(gè)主要的mock類,分別是Mock和MagicMock. 先看一下官方文檔的定義: MagicM...

    TigerChain 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<