我无法模拟接受**kwargs的函数。在这种情况下,我有一个ClassA(在我的具体例子中是我没有编写的),它有一个带有**kwargs的函数。类B,它有一个类A的实例,并调用**kwargs函数。我想通过模拟对类A函数的调用来测试类B。在
以下是我迄今为止所做的尝试,在我的两次尝试中,我都以输入错误而告终。有办法吗?我应该重新考虑一下这个问题的另一个方面吗?在
import unittest
#a class i have no control over. Has a function accepting **kwargs
class ClassA(object):
def classFunctionAcceptingKwargs(self, **kwargs):
return kwargs["a"] + kwargs["b"]
# a mock of the above class
class Mock_ClassA(object):
def __init__(self):
self.mockclassFunctionAcceptingKwargs = lambda **kwargs: None
def classFunctionAcceptingKwargs(self, **kwargs):
#FAILS: TypeError: mockFunctionAcceptingKwargs() takes exactly 0 arguments (1 given)
return self.mockclassFunctionAcceptingKwargs(kwargs)
#ALSO FAILS: TypeError: mockFunctionAcceptingKwargs() argument after ** must be a mapping, not set
#return self.mockclassFunctionAcceptingKwargs(**{kwargs["a"] + kwargs["b"]})
#class B calls the class A kwargs but exposes a function with a dict
class ClassB(object):
def __init__(self, classA):
self.classA = classA
def doSomething(self, dict):
return self.classA.classFunctionAcceptingKwargs(**dict)
class TestClassA(unittest.TestCase):
def runTest(self):
a = ClassA()
result = a.classFunctionAcceptingKwargs(**{"a":1, "b": 2})
self.assertEqual(result, 3)
class TestClassB(unittest.TestCase):
def runTest(self):
mock = Mock_ClassA()
def mockFunctionAcceptingKwargs(**kwargs):
self.assertEqual(kwargs["a"], 1)
self.assertEqual(kwargs["b"], 2)
mock.mockclassFunctionAcceptingKwargs = mockFunctionAcceptingKwargs
b = ClassB(mock)
b.doSomething({"a": 1, "b": 2})
堆栈跟踪:
^{pr2}$
我不知道你为什么要调用另一个函数。但是如果必须有一个实例属性
mockclassFunctionAcceptingKwargs
函数,那么只需使用**kwargs
传递kwargs
字典:如果您只需要
^{pr2}$classFunctionAcceptingKwargs
存在,则根本不需要调用该lambda:然后只需传入模拟的返回值,无论您需要为测试传递回
ClassB
,然后您可以检查是否传入了正确的值:您可能希望使用^{} library 来构建一个要传入的模拟对象(在python3中可用,并且可以为python2安装一个backport)。它将允许您创建一个模拟的
ClassA
,然后使用API测试mock是否以预期的方式使用:演示使用
unittest.mock
作为模拟层:相关问题 更多 >
编程相关推荐