我有两个文件:-file1.py和file2.py
file2.py有以下代码:-
import json
def fun1():
s = "{'function1': 'val1'}"
s = json.dumps(s)
print("in fun1 ", s)
return s
def fun2():
s = "{'function2': 'value2'}"
s = json.dumps(s)
print("in fun2 ", s)
return s
def fun5():
fun2()
return fun1()
file1.py有以下代码
from mockito import when, unstub
from file2 import fun5
def mock_the_function():
when("file2.fun1.json").dumps(...).thenReturn("something something")
print(fun5())
unstub()
我想嘲笑";转储";内部";fun1";只是,而不是";fun2";。我写的代码显示错误。我不想通过参数比较来做这件事。有没有其他方法可以让函数在"内部"传递;什么时候"?
首先简要说明:
json.dumps
接受一个对象,而不是字符串,所以在fun1
和fun2
内部调用它有点多余。也许你在找json.loads
接下来我会考虑一些不同的方法:
-
当您模拟
json.dumps
时,您希望模拟file2
模块的json
属性,因此它在测试的设置代码中只是when("file2.json")...
。 -
因为(如上所述(,我们在
file2
模块中全局地模拟json
模块,所以在单个测试的上下文中,不可能像您所要求的那样,在fun1
内部模拟json.dumps
,但不可能在fun2
内部模拟,但我建议您只需进行两个测试,并使用分解方法模拟unstub
。例如:
from unittest import TestCase
class TestExample(TestCase):
def tearDown(self):
unstub()
def test_fun1(self):
when("file2.json").dumps(...).thenReturn("something something")
# in this invocation json is stubbed
self.assertEqual(fun1(), "something something")
def test_fun2(self):
# but now unstub has been called so it won't be stubbed anymore.
self.assertEqual(fun2(), "...output of fun2...")
另一种选择是fun1
和fun2
采用一个函数,该函数将执行全局json
模块当前正在执行的工作。依赖反转原则的使用使代码更易于测试,这意味着您在测试中甚至不需要mockito
。例如:
def fun1(json_decoder):
s = "..."
return json_decoder(s)
# ....
from unittest.mock import MagicMock
def test_fun_1():
mock_decoder = MagicMock()
mock_decoder.return_value = "asdf"
assert fun1(mock_decoder) == "asdf"