2017-06-16 87 views
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) 
+0

的可能的复制[模拟父类\ _ \ _ init \ _ \ _方法](https://stackoverflow.com/questions/32349855/mock-parent-class-init-method) – grundic

+1

初始[可能不会返回非无值](https: //docs.python.org/3/reference/datamodel.html#object.__init__),否则会引发TypeError - 就像您观察到的那样。如果你想模拟'ConfigB.createvalue',你不应该'@ mock.patch('ConfigB.ConfigB.createvalue')'? –

+0

@IljaEverilä工作。我已经添加了我更新的测试方法。谢谢。 – EliSquared

回答

0

按照唐柯比,我已经把我的解决方案作为一个问题的答案:

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)