模拟初始化步骤并向模拟添加方法调用

Mocking initialization step and adding method calls to mock

我有一个 class 方法,我在其中实例化一个配置 class,然后在该 class 上调用一个方法:

from config.ConfigB import ConfigB

class FileRunner(object):
  def runProcess(self, cfgA)
    cfgB = ConfigB(cfgA)
    print(cfgB.createvalue())

我设置了以下测试 class 来尝试测试该方法,但它不起作用:

import unittest
import unittest.mock imort MagicMock
import mock
from FileRunner import FileRunner

class TestFileRunner(unittest.TestCase):
  @mock.patch('ConfigB.ConfigB.__init__')
  def test_methodscalled(self, cfgB):

    cfgA = MagicMock()

    fileRunner = FileRunner()

    cfgB.return_value = None
    cfgB.return_value.createValue.return_value = 17

    fileRunner.runProcess(cfgA)

但是当我测试 class 时出现错误:

AttributeError: 'NoneType' object has no attribute 'createValue'

我也试过这样写测试class:

import unittest
import unittest.mock imort MagicMock
import mock
from FileRunner import FileRunner

class TestFileRunner(unittest.TestCase):
  @mock.patch('ConfigB.ConfigB.__init__')
  def test_methodscalled(self, cfgB):

    cfgA = MagicMock()

    fileRunner = FileRunner()

    cfgBMock = mock.Mock()
    cfgBMock.createValue.return_value = 17

    cfgB.return_value = cfgBMock

    fileRunner.runProcess(cfgA)

但是当我尝试这个时,我得到了错误:

TypeError: __init__() should return None, not 'Mock'

我做错了什么?有没有更好的方法来测试我的 class?

*编辑:这是基于以下评论的解决方案:

import unittest
import unittest.mock imort MagicMock
import mock
from FileRunner import FileRunner

class TestFileRunner(unittest.TestCase):
  @mock.patch('ConfigB.ConfigB.__init__')
  @mock.patch('ConfigB.ConfigB.createValue')
  def test_methodscalled(self, createValue, cfgB):

    cfgA = MagicMock()

    fileRunner = FileRunner()


    createValue.return_value = 17

    cfgB.return_value = None

    fileRunner.runProcess(cfgA)

根据 Don Kirby,我已将我的解决方案作为问题的答案:

import unittest.mock import MagicMock

from FileRunner import FileRunner

class TestFileRunner(unittest.TestCase):
  @mock.patch('ConfigB.ConfigB.__init__')
  @mock.patch('ConfigB.ConfigB.createValue')
  def test_methodscalled(self, createValue, cfgB):
    cfgA = MagicMock()
    fileRunner = FileRunner()
    createValue.return_value = 17
    cfgB.return_value = None
    fileRunner.runProcess(cfgA)