У меня возникают проблемы с пониманием того, как написать модульный тест Python 3, который использует фиктивные объекты для имитации метода экземпляра для модели Django.Вот мои модели и тест:
# models.py
class Author(models.Model):
name = models.CharField(max_length=50)
class Book(models.Model):
title = models.CharField(max_length=100)
author = models.ForeignKey(Author, related_name='books')
def retrieve_isbn(self):
return 'abc123'
# tests.py
class TestModel(unittest.TestCase):
@mock.patch('run.models.Book', autospec=True)
@mock.patch('run.models.Author', autospec=True)
def test_book_isbn(self, mock_author, mock_book):
mock_author.name = 'Henry Miller'
mock_book.title = 'Time of the Assassins'
mock_book.author = mock_author
mock_book.retrieve_isbn = MagicMock(return_value='foo123')
# the next line doesn't work either
#mock_book.retrieve_isbn.return_value = 'foo123'
isbn = Book().retrieve_isbn()
self.assertEqual(isbn, 'foo123')
Мой тест не проходит с этой ошибкой:
AssertionError: 'abc123' != 'foo123'
Насколько я понимаю, когда я создаю объект mock_book, любые вызовы экземпляровкласс Book будет перехвачен и заменен значениями, которые я присваиваю атрибутам фиктивного объекта.Разве строка "mock_book.retrieve_isbn = MagicMock (return_value = 'foo123')" не будет вызывать какие-либо вызовы метода retrieve_isbn класса Book для возврата 'foo123' или я неправильно настроил свой тест?