第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

pytest - 修補類不起作用,而是調(diào)用類

pytest - 修補類不起作用,而是調(diào)用類

絕地?zé)o雙 2022-01-05 10:57:04
不知道為什么,但這是我的代碼片段:stats_collector.pyclass StatsCollector( object ) :def __init__( self, user_id, app_id ) :    logging.info( "Stats: APP_ID = {0}, ID = {1}".format( app_id, user_id ) )mydb.pyfrom namespacename.mylibname.stats_collector import StatsCollectorclass Db( object ) :    # constructor/destructor    def __init__( self, dbname ) :        ....    def beginTransaction( self, user_id, app_id ) :        logging.info( "Begin" )        self._stats = StatsCollector( user_id, app_id ) test_mylibname_mydbfrom namespacename.mylibname.mydb import Dbfrom namespacename.mylibname.stats_collector import StatsCollector@pytest.mark.mydb_temp@mock.patch( 'namespacename.mylibname.stats_collector.StatsCollector')def test_db_beginTransaction( mock_stats_collector ) :    db = Db( TEST_DB_NAME )    mock_stats_collector.return_value = mock.Mock()    db.beginTransaction( TEST_ID, TEST_APP_ID )    ......    ......我可以在我的登錄中看到我的stats_collector.__init__- 為什么我要輸入它?不應(yīng)該在我的內(nèi)部beginTransaction調(diào)用StatsCollector返回值是 MockObject 并且我不應(yīng)該看到任何日志嗎?結(jié)構(gòu)如下:tests/├── mylibname│   ├── test_mylibname_mydb.pynamespacename/mylibname├── stats_collector│   ├── mylibname_stats_collector.py│   ├── __init__.py├── mydb│   ├── mylibname_mydb.py│   ├── __init__.py** 編輯 **遵循有關(guān)評論的建議 -@mock.patch( 'namespacename.mylibname.mydb.StatsCollector')def test_db_beginTransaction( mock_stats_init ) :    db = Db( TEST_DB_NAME )    db.beginTransaction( TEST_UUID, TEST_APP_ID )    print db._transaction    assert db._transaction is mock_stats_init讓我:E       AssertionError: assert <namespacename.mylibname.stats_collector.mylibname_stats_collector.StatsCollector object at 0x7f42d837b110> is <MagicMock name='StatsCollector' id='139925072008976'>E        +  where <namespacename.mylibname.stats_collector.mylibname_stats_collector.StatsCollector object at 0x7f42d837b110> = <namespacename.mylibname.mydb.mylibname_mydb.Db object at 0x7f42d8365850>._transaction
查看完整描述

3 回答

?
MYYA

TA貢獻(xiàn)1868條經(jīng)驗 獲得超4個贊

您需要修補正在測試的模塊中的符號“A”,即“B”。

當(dāng)你這樣做時@mock.patch("full.path.A"),它應(yīng)該是:

@mock.patch("full.path.to.B.A")

現(xiàn)在A模塊中的符號B用你的模擬打了補丁。


查看完整回答
反對 回復(fù) 2022-01-05
?
米琪卡哇伊

TA貢獻(xiàn)1998條經(jīng)驗 獲得超6個贊

你不是錯過了文件本身的名稱嗎?

@mock.patch( 'namespacename.mylibname.stats_collector.mylibname_stats_collector.StatsCollector')



查看完整回答
反對 回復(fù) 2022-01-05
?
小怪獸愛吃肉

TA貢獻(xiàn)1852條經(jīng)驗 獲得超1個贊

當(dāng)我寫這篇文章時,你可能已經(jīng)想通了。


經(jīng)驗法則:不要在定義類或函數(shù)的地方打補丁,而是在使用它們的地方打補丁。


a.py


class A:

    def exponent(self, a, b)

        return a ** b

    


b.py    



from a import A

class B:

   def add_constat(a, b, c)

      return A().exponent(a, b) + c

      

  

  

  

為了測試 add_constant 方法,您可能會想像這樣修補 A


TestB:


@patch('a.A.exponent', mock_a)

    test_add_constant(self, mock_a) 

這是錯誤的,因為您正在修補給出定義的文件中的類。


A 在類 B 的文件 b 中使用。因此,您應(yīng)該修補該類。


TestB:


    @patch('b.A')

    test_add_constant(self, mock_a):

    # mock_a is fake class of A, the return_value of mock_a gives us an instance (object) of the class(A)

    instance_a = mock_a.return_value # 

   

    # we now have instance of the class i.e A, hence it is possible to call the methods of class A

   

    instance_a.exponent.return_value = 16

   

    assert 26 = B().add_constant(2,4,10)

我對您的代碼進(jìn)行了一些修改,以便它可以在我的 Python 環(huán)境中使用。


stats_collector.py


class StatsCollector:

    def __init__(self, user_id, app_id):

        self.user_id = user_id

        self.app_id = app_id


    def stat(self):

        return self.user_id + ':' + self.app_id



mydb.py


from stats_collector import StatsCollector

import logging


class Db:

    # constructor

    def __init__(self, db_name):

        self.db_name = db_name


    def begin_transaction(self, user_id, app_id):

        logging.info("Begin")

        stat = StatsCollector(user_id, app_id).stat()


        if stat:

            return user_id + ':' + app_id

        return "wrong User"

使用類似的比喻:為了測試文件 mydb.py 的 Db 類中的“begin_transaction”,您需要修補 mydb.py 文件中使用的 StatsCollector 類


test_mydb.py


from unittest.mock import patch

from unittest import TestCase



class TestDb(TestCase):


    @patch('mydb.StatsCollector')

    def test_begin_transaction(self, db_class_mock):


        # db_class_mock is the mock of the class, it is not an instance of the DB class.

        # to create an instance of the class, you need to call return_value

       

        db_instance = db_class_mock.return_value

        db_instance.stat.return_value = 1

        # i prefere to do the above two lines in just one line as


        #db_class_mock.return_value.stat.return_value = 1

        


        db = Db('stat')

        expected = db.begin_transaction('Addis', 'Abeba')


        assert expected == 'Addis' + ':' + 'Abeba'


        # set the return value of stat method

        db_class_mock.return_value.stat.return_value = 0

        expected = db.begin_transaction('Addis', 'Abeba')


        assert expected == "wrong User"

我希望這可以幫助網(wǎng)絡(luò)中的某人


查看完整回答
反對 回復(fù) 2022-01-05
  • 3 回答
  • 0 關(guān)注
  • 184 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號