Почему unittest не распознает тип данных SQLAlchemy? - PullRequest
2 голосов
/ 10 февраля 2020

Я написал функцию, которая возвращает тип данных SQLAlchemy вместе с параметрами этого типа. Но когда я пытаюсь протестировать эту функцию, unittest сообщает мне, что тип, который возвращает моя функция, не соответствует ожидаемому типу. Однако мне кажется, что это показывает, что возвращаемое значение функции и мой ожидаемый результат действительно совпадают.

Пример упрощенного кода ...

from sqlalchemy import Numeric

class TestStandardizeColDataTypes(unittest.TestCase):
    def test_successful_numeric(self):
        self.assertEqual(standardize_col_data_type('Dec'), Numeric(precision=12, scale=2))

Вот то, что показывают результаты unittest (через Пихарм) ...

Numeric(precision=12, scale=2) != Numeric(precision=12, scale=2)

Expected :Numeric(precision=12, scale=2)
Actual   :Numeric(precision=12, scale=2)

Похоже, они равны. Я безуспешно пытался изменить тип теста на AssertIs и AssertIsInstance.

Есть идеи о том, что мне здесь не хватает? Спасибо!

Ответы [ 2 ]

3 голосов
/ 10 февраля 2020

Проблема в том, что вы пытаетесь сравнить равенство между двумя объектами, для которых не реализован метод __eq__. Вы можете видеть, что в документах как показано здесь .

Причина такого поведения заключается в следующем:

Пользовательские классы имеют * Методы 1010 * eq () и ha sh () по умолчанию; с ними все объекты сравниваются неравно (кроме самих себя), а x. ha sh () возвращает соответствующее значение, такое, что x == y подразумевает, что x это y, а ha sh (x ) == ha sh (y).

Вы можете найти то, что описано более подробно здесь

Один из вариантов будет сделать пользовательский класс, который наследуется от типа Numeric и определяет метод __eq__. Другой вариант - то, что @rdas упоминает в своем комментарии:

Вам лучше сравнивать точность и масштаб вручную.

1 голос
/ 10 февраля 2020

То, что сказал @aws_apprentice, верно. Однако простой обходной путь - это сравнение словарей атрибутов двух объектов, возвращаемых функцией vars:

self.assertEqual(vars(standardize_col_data_type('Dec')), vars(Numeric(precision=12, scale=2)))

Это позволяет избежать необходимости жестко кодировать имя каждого атрибута отдельно для сравнения.

...