如何在python中同时调用两个函数调用时修补它们

如何在python中同时调用两个函数调用时修补它们,python,mocking,python-unittest,python-mock,Python,Mocking,Python Unittest,Python Mock,我有一个函数,它使用下面的代码 def get_doc_hash(doc): return hashlib.md5(doc.encode(‘utf-8’)).hexdigest() 如何模拟md5()和hexdigest()的调用来编写此函数的测试用例?正如注释中指出的,最好测试预期行为,但纯粹为了展示如何链接模拟,下面是如何完成的: import hashlib import unittest from unittest.mock import patch def get_

我有一个函数,它使用下面的代码

def get_doc_hash(doc):
       return hashlib.md5(doc.encode(‘utf-8’)).hexdigest()

如何模拟md5()和hexdigest()的调用来编写此函数的测试用例?

正如注释中指出的,最好测试预期行为,但纯粹为了展示如何链接模拟,下面是如何完成的:

import hashlib
import unittest
from unittest.mock import patch


def get_doc_hash(doc):
    return hashlib.md5(doc.encode("utf-8")).hexdigest()


class TestHash(unittest.TestCase):
    @patch('hashlib.md5')
    def test_get_doc_hash_to_demonstrate_mock_chaining(self, mock_hashlib):
        mock_hashlib.return_value.hexdigest.return_value = "digested"
        hash_out = get_doc_hash("test doc")
        mock_hashlib.assert_called_once_with("test doc".encode("utf-8"))
        mock_hashlib.return_value.hexdigest.assert_called_once()
        self.assertEqual(hash_out, "digested")

正如评论中所指出的,最好测试预期行为,但纯粹是为了展示如何链接模拟,下面是如何做到的:

import hashlib
import unittest
from unittest.mock import patch


def get_doc_hash(doc):
    return hashlib.md5(doc.encode("utf-8")).hexdigest()


class TestHash(unittest.TestCase):
    @patch('hashlib.md5')
    def test_get_doc_hash_to_demonstrate_mock_chaining(self, mock_hashlib):
        mock_hashlib.return_value.hexdigest.return_value = "digested"
        hash_out = get_doc_hash("test doc")
        mock_hashlib.assert_called_once_with("test doc".encode("utf-8"))
        mock_hashlib.return_value.hexdigest.assert_called_once()
        self.assertEqual(hash_out, "digested")

听起来你根本不需要嘲笑任何东西。你可以测试它。我可以测试字符串返回类型,但我只想知道如何模拟它们,以发现对md5和hexdigest的调用是进行的。但重要的是行为,而不是实现。您应该测试该函数是否生成正确的散列,而不是它是否以某种特定方式使用某个特定的散列库。@user2357112supportsMonica我同意我可以计算散列并调用测试函数,然后执行断言。但我只是想知道如何做到这一点。当两个函数调用一起调用时修补它们。在这种情况下,测试可能很简单,但从我的观点来看,模拟任何第三方调用是一种有效的策略,因为我们不测试它们-只测试它们是否被适当调用,听起来根本不需要模拟任何东西。你可以测试它。我可以测试字符串返回类型,但我只想知道如何模拟它们,以发现对md5和hexdigest的调用是进行的。但重要的是行为,而不是实现。您应该测试该函数是否生成正确的散列,而不是它是否以某种特定方式使用某个特定的散列库。@user2357112supportsMonica我同意我可以计算散列并调用测试函数,然后执行断言。但我只是想知道如何做到这一点。当两个函数调用一起调用时,对它们进行修补。在这种情况下,测试可能很简单,但从我的观点来看,模拟任何第三方调用是一种有效的策略,因为我们不测试它们-只测试它们是否被适当调用感谢您的响应。我正在学习添加测试用例,并希望找到这个范例,尽管它在这里没有意义。这对我有帮助。我看到有问题的评论。当我在电话里问这个问题时,我又加了一个错别字。我已经编辑了代码以更正它。感谢您的回复。我正在学习添加测试用例,并希望找到这个范例,尽管它在这里没有意义。这对我有帮助。我看到有问题的评论。当我在电话里问这个问题时,我又加了一个错别字。我已编辑代码以更正它。