簡體   English   中英

為什么這個帶有模擬對象的Python / Django單元測試不起作用?

[英]Why Doesn't This Python/Django Unit Test with Mock Objects Work?

我在理解如何編寫使用模擬對象模擬Django模型的實例方法的Python 3單元測試時遇到麻煩。 這是我的模型和測試:

# 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'

據我了解,當我創建模擬對象對象時,對Book類實例的任何調用都將被攔截,並替換為我分配給模擬對象屬性的值。 “ mock_book.retrieve_isbn = MagicMock(return_value ='foo123')”行是否會導致對Book類的retrieve_isbn方法的任何調用返回“ foo123”,還是我沒有正確設置測試?

這是這樣做的方法(忽略所有多余的東西):

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM