【发布时间】:2012-02-05 17:09:28
【问题描述】:
单元测试应该测试功能并尽量不了解实现细节。
Mock.assert_called_with() 是一个方便的函数,但 AFAIK 将 *args 与 *args 和 **kwargs 与 **kwargs 进行比较。因此:
# class to be mocked during test
class SomeClass():
def func(self,a,b,c=5):
# ...
# code under test
somaclass_instance.func(1,b=2,c=3)
# test code that works
someclass_mock.func.assert_called_with(1,b=2,c=3)
# test code that won't work
someclass_mock.func.assert_called_with(1,2,c=3)
someclass_mock.func.assert_called_with(a=1,b=2,c=3)
有没有办法对此进行概括,以便在调用 func 时用作 **kwargs 的 *args 的细节(这实际上是一个实现细节)将被忽略?
【问题讨论】:
-
我不是 100% 确定我理解你的问题,但是你可以在同一个函数调用中传递 *args 和 **kwargs,或者,因为 args 是元组类型,而 kwargs 是字典,您也许可以编写一个包装函数,将输入标准化为您确定可以工作的输入。
-
现在是否有任何模拟框架可以做到这一点?我的测试不应该仅仅因为有人决定在某个时候将位置参数更改为关键字参数而失败。但是,这个问题是我见过的唯一一次提到这个问题。 Mock 已经支持规范对象,所以这应该是可能的?
标签: python unit-testing mocking