Макет Python: AssertionError: ожидаемый и фактический вызов не совпадают

Я новичок в библиотеке unittest.mock и не могу решить проблему, с которой столкнулся. У меня есть класс с именем «function.py» в приведенной ниже структуре папок.

  • src _ init.py
    • function.py
  • tests
    • init.py
    • test_function.py

В test_function.py у меня есть такой код:

    import unittest
    from unittest import mock
    from ..src.function import get_subscriptions
    from ..src import function

class TestCheckOrder(unittest.TestCase):
    @mock.patch.object(function, 'table')
    def test_get_subscriptions_success(self, mocked_table):

        mocked_table.query.return_value = []
        user_id = "test_user"
        status = True

        get_subscriptions(user_id, status) 
        mocked_table.query.assert_called_with(
          KeyConditionExpression=conditions.Key('user_id').eq(user_id),
          FilterExpression=conditions.Attr('status').eq(int(status)))

В function.py:

import boto3
from boto3.dynamodb import conditions
dynamodb = boto3.resource("dynamodb")
table = dynamodb.Table("Subscriptions")

def get_subscriptions(user_id, active=True):
    results = table.query(
        KeyConditionExpression=conditions.Key(
        'user_id').eq(user_id),
        FilterExpression=conditions.Attr('status').eq(int(active))
    )

return results['Items']

Если я запускаю это, я получаю следующее исключение:

**AssertionError: Expected call: query(FilterExpression=<boto3.dynamodb.conditions.Equals object at 0x1116011d0>, KeyConditionExpression=<boto3.dynamodb.conditions.Equals object at 0x111601160>)
Actual call: query(FilterExpression=<boto3.dynamodb.conditions.Equals object at 0x1116010f0>, KeyConditionExpression=<boto3.dynamodb.conditions.Equals object at 0x111601080>)**

Заранее спасибо за помощь.


person Vivek    schedule 21.03.2018    source источник


Ответы (1)


Проблема в том, что когда вы вызываете assert_called_with в своем тесте, вы создаете новые экземпляры conditions.Key и conditions.Attr. И поскольку эти экземпляры отличаются от тех, которые были у нас в реальном вызове, есть несоответствие (проверьте шестнадцатеричные идентификаторы, показанные в трассировке).

Вместо этого вы можете получить kwargs из самого вызова функции и проверить их свойства:

name, args, kwargs = mocked_table.query.mock_calls[0]
assert kwargs['KeyConditionExpression'].get_expression()['values'][1] == user_id
assert kwargs['FilterExpression'].get_expression()['values'][1] == int(status)
person Ashwini Chaudhary    schedule 21.03.2018