Сегодня я начал unittest, и у меня возникла проблема, я чувствую, что это что-то очевидное, но, возможно, вы, ребята, это увидите. Этот блок является файлом, который содержит информацию
names.py
class Person:
def __init__(self, firstname, lastname, middlename = ""):
self.firstname = firstname
self.lastname = lastname
self.middlename = middlename
def fullname(self):
if self.middlename:
return self.firstname + " " + self.middlename + " " + self.lastname
else:
return self.firstname + " " + self.lastname
и это тестовое приложение
import unittest
from names import Person
class TestName(unittest.TestCase):
def test_fullname(self):
rashka = Person("John","Smith","James")
self.assertEqual(rashka.fullname, "John James Smith")
if __name__ == "__main__":
unittest.main()
и я получаю эту ошибку, когда я ее запускаю
AssertionError: <bound method Person.fullname
of <names.Person object at 0x0371A690>> != 'John James Smith'
Как и другие ответы, fullname
- это метод на вашем экземпляре, и поэтому его нужно вызывать как любую другую функцию:
>>> rashka.fullname
<bound method Person.fullname of <names.Person object at 0x0371A690>>
>>> rashka.fullname()
'John James Smith'
В качестве альтернативы вы также можете использовать декоратор property
чтобы получить доступ к атрибуту:
class Person:
def __init__(self, firstname, lastname, middlename = ""):
self.firstname = firstname
self.lastname = lastname
self.middlename = middlename
@property # <-- new
def fullname(self):
if self.middlename:
return self.firstname + " " + self.middlename + " " + self.lastname
else:
return self.firstname + " " + self.lastname
Теперь, rashka.fullname
вернет имя (без скобок), как вы писали в своем тесте.
>>> rashka.fullname
'John James Smith'
Вам нужно вызвать rashka.fullname()
иначе вы сравниваете метод с str.
rashka.fullname()