gpt4 book ai didi

python - 使用 Python unittest 测试回调调用的正确方法是什么?

转载 作者:行者123 更新时间:2023-11-28 21:20:49 27 4
gpt4 key购买 nike

我有一个如下所示的应用程序代码。

# Filename: app.py
class Foo:
def __init__(self):
self.callback = None

def set_handler(self, callback):
self.callback = callback

def run(self, details):
name, age = details.split('/')
if age.isdigit():
age = int(age)
else:
age = -1
return self.callback(name, age)

如您所见,它提供了一个set_handler 方法来设置回调。稍后必须使用两个参数调用回调:一个字符串和一个整数。我试图在单元测试中确保这一点。

# Filename: test_app.py
import unittest
from app import Foo

class AppTest(unittest.TestCase):
def f(self, a, b):
# This callback should get called with the first argument as
# string and the second argument as integer
return repr(a) + ',' + repr(b)

def test_callback(self):
foo = Foo()
foo.set_handler(self.f)
self.assertEqual(foo.run('John/20'), "'John',20")
self.assertEqual(foo.run('John/xyz'), "'John',-1")

if __name__ == '__main__':
unittest.main()

本单元测试成功。但我不认为我的测试方式是可靠的。这个单元测试基本上是一个 hack,因为我不知道如何正确测试是否使用正确类型的参数调用了回调。我觉得奇怪的是 AppTest 的 f 方法通过尝试返回一个由参数的 repr() 组成的值来分担类型检查的责任,并且至少可以说,这一点也不稳健。

你能帮帮我吗?是否可以减轻 f 方法测试类型的责任?

最佳答案

编辑:

尝试使用 unittest.mock (Python 3.3 上的标准库)。它允许您断言方法是如何被调用的。例如:

import unittest
from unittest.mock import Mock

from app import Foo

class AppTest(unittest.TestCase):

def test_callback(self):
foo = Foo()
f = Mock()
foo.set_handler(f)

foo.run('John/20')
f.assert_called_with('John', 20)

foo.run('John/xyz')
f.assert_called_with('John', -1)

if __name__ == '__main__':
unittest.main()

关于python - 使用 Python unittest 测试回调调用的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22282101/

27 4 0