pytest - исправление класса не работает, вместо этого вызывается класс - PullRequest
0 голосов
/ 09 апреля 2019

Не знаю, почему, но вот мой фрагмент кода:

stats_collector.py

class StatsCollector( object ) :
def __init__( self, user_id, app_id ) :
    logging.info( "Stats: APP_ID = {0}, ID = {1}".format( app_id, user_id ) )

mydb.py

from namespacename.mylibname.stats_collector import StatsCollector
class 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_mydb

from namespacename.mylibname.mydb import Db
from 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__ - зачем мне это вводить?Разве когда внутри моего beginTransaction я называю возвращаемое значение StatsCollector MockObject, и я не вижу никаких журналов?

Структура выглядит так:

tests/
├── mylibname
│   ├── test_mylibname_mydb.py
namespacename/mylibname
├── stats_collector
│   ├── mylibname_stats_collector.py
│   ├── __init__.py
├── mydb
│   ├── mylibname_mydb.py
│   ├── __init__.py

**Редактировать **

Следуя советам по комментарию -

@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

Ответы [ 2 ]

1 голос
/ 15 апреля 2019

Не упускаете ли вы имя самого файла?

@mock.patch( 'namespacename.mylibname.stats_collector.mylibname_stats_collector.StatsCollector')
0 голосов
/ 09 апреля 2019

Вам необходимо установить символ «А» в тестируемом модуле, т.е. «В».

Когда вы делаете @mock.patch("full.path.A"), оно должно быть:

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

Теперь символ A в модуле B пропатчен вашим макетом.

...