0
我有一个类的方法,我实例化一个配置类,然后调用这个类的一个方法:嘲讽初始化步骤和添加方法调用嘲笑
from config.ConfigB import ConfigB
class FileRunner(object):
def runProcess(self, cfgA)
cfgB = ConfigB(cfgA)
print(cfgB.createvalue())
我有以下的测试类设置尝试测试方法,但它不工作:
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)
但是当我测试类我得到的错误:
AttributeError: 'NoneType' object has no attribute 'createValue'
我也试着写测试类是这样的:
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'
我在做什么错?有没有更好的方法来测试我的班级?
*编辑:这是基于下面的注释解决方案:
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)
的可能的复制[模拟父类\ _ \ _ init \ _ \ _方法](https://stackoverflow.com/questions/32349855/mock-parent-class-init-method) – grundic
初始[可能不会返回非无值](https: //docs.python.org/3/reference/datamodel.html#object.__init__),否则会引发TypeError - 就像您观察到的那样。如果你想模拟'ConfigB.createvalue',你不应该'@ mock.patch('ConfigB.ConfigB.createvalue')'? –
@IljaEverilä工作。我已经添加了我更新的测试方法。谢谢。 – EliSquared