【问题标题】:Why Doesn't This Python/Django Unit Test with Mock Objects Work?为什么这个带有 Mock 对象的 Python/Django 单元测试不起作用?
【发布时间】:2018-05-21 22:04:17
【问题描述】:

我无法理解如何编写 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')”这行是否会导致对 Book 类的 retrieve_isbn 方法的任何调用返回 'foo123' 或者我没有正确设置我的测试?

【问题讨论】:

  • 但是在最后一行,你调用真正的Book(),用Book().retrieve_isbn()
  • 我也可以写 book = Book() 然后调用 book.retrieve_isbn(),但这并没有什么不同。

标签: python django unit-testing mocking


【解决方案1】:

这是怎么做的(省略所有无关的东西):

@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')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-26
    • 2013-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多