函数[python]中对象的Mock方法



我有两个文件:-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接受一个对象,而不是字符串,所以在fun1fun2内部调用它有点多余。也许你在找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...")

另一种选择是fun1fun2采用一个函数,该函数将执行全局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"

最新更新