Почему этот модульный тест Python / Django с фиктивными объектами не работает? - PullRequest
0 голосов
/ 22 мая 2018

У меня возникают проблемы с пониманием того, как написать модульный тест 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' или я неправильно настроил свой тест?

1 Ответ

0 голосов
/ 22 мая 2018

Вот как это сделать (опуская все посторонние вещи):

@mock.patch('run.models.Book.retrieve_isbn')
def test_book_isbn(self, mock_method):
    mock_method.return_value = 'foo123'
    isbn = Book().retrieve_isbn()
    self.assertEqual(isbn, 'foo123')
...