** kwargsを受け入れる関数を嘲笑するのに問題があります。このシナリオでは、私はClassAを持っています(特定のケースでは私が書いたことはありません)。そして、それは** kwargsの関数を持っています。 ClassBのインスタンスを持ち、** kwargs関数を呼び出すClassB。クラスAの関数呼び出しを嘲笑してClassBをテストしたい。** kwargsを受け付ける関数を嘲笑する
これまで私が試したのはこれまでのことで、両方の試みで、私はTypeErrorで終わった。これを行う方法はありますか?私はこれの別の側面を考え直すべきですか?
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})
スタックトレース:
Test Name: TestClassB
Test Outcome: Failed
Result StandardError:
======================================================================
ERROR: runTest (module1.TestClassB)
----------------------------------------------------------------------
Traceback (most recent call last):
File "C:\test\module1.py", line 49, in runTest
b.doSomething({"a": 1, "b": 2})
File "C:\test\module1.py", line 28, in doSomething
return self.classA.classFunctionAcceptingKwargs(**dict)
File "C:\test\module1.py", line 18, in classFunctionAcceptingKwargs
return self.mockclassFunctionAcceptingKwargs(kwargs)
TypeError: mockFunctionAcceptingKwargs() takes exactly 0 arguments (1 given)
----------------------------------------------------------------------
Ran 1 test in 12.873s
FAILED (errors=1)