
本文介绍了如何使用 pytest 和 monkeypatch 来模拟一个可调用类,并能够在多个测试中复用和自定义其返回值。通过使用类工厂函数,可以动态创建具有不同返回值的模拟类,从而避免在每个测试中重复定义模拟类,提高测试代码的可维护性和可读性。
模拟可调用类
在编写单元测试时,经常需要模拟外部依赖项,以便隔离被测代码并控制其行为。当依赖项是一个可调用类时,模拟起来可能会比较棘手。pytest 的 monkeypatch 提供了强大的功能,可以替换类、函数、模块等,从而实现模拟。
假设我们有一个类 LLMChain,它是一个可调用类,并且在我们的代码中使用。为了测试依赖于 LLMChain 的代码,我们需要创建一个模拟的 LLMChain 类,并控制其 __call__ 方法的返回值。
使用类工厂函数
一种有效的方法是使用类工厂函数。类工厂函数是一个返回类的函数。我们可以使用它来动态创建具有不同返回值的模拟类。
def mock_llm_chain(retval): """ 创建一个模拟 LLMChain 类的工厂函数。 Args: retval: __call__ 方法的返回值。 Returns: 一个模拟 LLMChain 类。 """ class MockLLMChain: """ 模拟 LLMChain 类。 """ def __init__(self, *args, **kwargs): pass def __call__(self, *args, **kwargs): return retval return MockLLMChain
在这个例子中,mock_llm_chain 函数接受一个参数 retval,它将作为模拟类的 __call__ 方法的返回值。该函数返回一个名为 MockLLMChain 的类。
在测试中使用模拟类
现在我们可以在测试中使用这个模拟类了。
def test_yes_no_classifier(yes_no_classifier, monkeypatch): """ 测试 yes_no_classifier。 """ # 创建一个模拟 LLMChain 类,并设置其返回值为 {'text': 'default'} ml = mock_llm_chain({'text':'default'}) # 使用 monkeypatch 替换 src.query_helpers.yes_no_classifier 中的 LLMChain 类 import src.query_helpers.yes_no_classifier monkeypatch.setattr( src.query_helpers.yes_no_classifier, "LLMChain", ml ) # 调用被测代码 response = yes_no_classifier.classify( conversation="1234", statement="The sky is blue." ) # 断言结果 assert response == 9
在这个测试中,我们首先使用 mock_llm_chain 函数创建了一个模拟的 LLMChain 类,并设置其返回值为 {‘text’: ‘default’}。然后,我们使用 monkeypatch.setattr 将 src.query_helpers.yes_no_classifier 模块中的 LLMChain 类替换为我们的模拟类。最后,我们调用被测代码并断言结果。
注意事项
确保在测试完成后恢复被模拟的对象,以避免影响其他测试。monkeypatch 默认会在测试结束后自动恢复。可以根据需要创建多个不同的模拟类,以覆盖不同的测试场景。使用类工厂函数可以使测试代码更加简洁和易于维护。
总结
通过使用 pytest 和 monkeypatch,我们可以轻松地模拟可调用类,并控制其返回值。使用类工厂函数可以使模拟类的创建更加灵活和可复用,从而提高测试代码的质量和效率。这种方法特别适用于需要模拟复杂外部依赖项的场景。
以上就是使用 pytest 和 monkeypatch 模拟可调用类并复用返回值的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1376873.html
微信扫一扫
支付宝扫一扫