Попытка сравнить домашний объект со строковым объектом в модульном тестировании - PullRequest
0 голосов
/ 27 апреля 2020

Я пытаюсь проверить, работает ли метод в моем модульном тестировании. Как видно из приведенного ниже кода в моей ошибке, я пытаюсь сравнить мой домашний объект с моим строковым объектом, и при распечатке их обоих они, безусловно, равны друг другу. Мой вопрос заключается в том, как мне изменить мой домашний объект на строковый объект или мой строковый объект на домашний объект, чтобы пройти тест. Также, если это помогает, это также тестирование базы данных в памяти. Спасибо!

Код юнит-тестирования

from unittest import TestCase
from main import ContactApp
from database import CombinedDatabase, Home, Person, Location, Contact

     class TestContactApp(TestCase):
         def test_commit_data(self):
         url = CombinedDatabase.construct_in_memory_url()
         contact_database = CombinedDatabase(url)
         contact_database.ensure_tables_exist()
         session = contact_database.create_session()
         home_address = Home(address='3069 U St.')
         patient1 = Person(patient_name='Mike Piazza')
         ContactApp.commit_data(session, str(patient1), str(home_address), '456324A', 96.4, 'USA',  'Nebraska', 'Omaha', '54229')
         actual = session.query(Home).one()
         actual2 = session.query(Person).one()
         print(home_address, actual.address)
         self.assertEqual(home_address, actual.address)
         self.assertEqual(patient1, actual2.patient_name)

Ошибка

<database.Home object at 0x7fe4ae20ce48> <database.Home object at 0x7fe4ae20ce48>
#printed out objects

<database.Home object at 0x7fe4ae20ce48> != <database.Home object at 0x7fe4ae20ce48>

<database.Home object at 0x7fe4ae20ce48>
<database.Home object at 0x7fe4ae20ce48>
<Click to see difference>

Traceback (most recent call last):
  File "/home/cse/Pycharmedu2019.1.1/pycharm-edu-2019.1.1/helpers/pycharm/teamcity/diff_tools.py", line 32, in _patched_equals
old(self, first, second, msg)
  File "/usr/lib64/python3.6/unittest/case.py", line 829, in assertEqual
assertion_func(first, second, msg=msg)
  File "/usr/lib64/python3.6/unittest/case.py", line 822, in _baseAssertEqual
raise self.failureException(msg)
AssertionError: <database.Home object at 0x7fe4ae20ce48> != '<database.Home object at 0x7fe4ae20ce48>'

1 Ответ

1 голос
/ 27 апреля 2020

Вы можете преобразовать ваш домашний объект в строку, определив метод __str__. Он будет вызываться всякий раз, когда вы запускаете str(home):

class Home:
    def __init__(self, address):
        self.address = address

    def __str__(self):
        return self.address


def main():
    address = '3069 U St.'
    my_home = Home(address=address)
    print(my_home)  # Prints '3069 U St.' because printing converts to a String
    print(my_home == address)  # False, because my_home is a Home, not a String
    print(str(my_home) == address)  # True, because we defined the __str__ method

Если вы не хотите каждый раз преобразовывать его в строку, вы также можете переместить эти логики c в метод __eq__ , который будет вызываться всякий раз, когда вы проверяете равенство:

class Home:
    def __init__(self, address):
        self.address = address

    def __eq__(self, other):
        if isinstance(other, str):
            return other == self.address
        elif isinstance(other, Home):
            return other.address == self.address
        else:
            return False


def main():
    address = '3069 U St.'
    my_home = Home(address=address)
    print(my_home == address)  # True, because we redefined what equality means
...