【发布时间】:2015-11-27 18:24:28
【问题描述】:
我正在尝试在一个派生自另一个类的类上编写一些单元测试,但是我在模拟父类 init 方法时遇到了一些困难,这是你做不到的,所以我正在寻找建议.
这是我的课程的示例
导入的.py
class Imported():
def __init__(self, a="I am Imported"):
print("a:{}".format(a))
父.py
from Imported import Imported
class Parent(object):
parent_list = ["PARENT"]
def __init__(self, a="I am Parent"):
imported = Imported(a)
派生的.py
from Parent import Parent
class Derived(Parent):
Parent.parent_list.append("DERIVED")
在我的单元测试中,当我从 Derived 类 Derived() 实例化一个对象时,我想验证 Parent.parent_list == ["PARENT", "DERIVED"]。
这两个解决方案都不起作用
test_Derived.py
import unittest
from mock import patch
from Derived import Derived
class test_Derived(unittest.TestCase):
@patch("Derived.Parent.__init__")
def test_init_001(self, mock_parent_init):
a = Derived("I am Derived")
mock_parent_init.assert_called_with("I am Derived")
self.assertEquals(a.parent_list, ["PARENT", "DERIVED"])
@patch("Derived.Imported.Imported")
def test_init_002(self, mock_parent_init):
a = Derived("I am Derived")
mock_parent_init.assert_called_with("I am Derived")
self.assertEquals(a.parent_list, ["PARENT", "DERIVED"])
test_init_001 失败
TypeError: __init__() should return None, not 'MagicMock'
test_init_002 失败
ImportError: No module named Parent.Imported
有什么建议吗?
【问题讨论】:
-
为什么
Parent.__init__需要被嘲笑?为什么不只是模拟Imported? -
你的第二个测试需要模拟
Parent.Imported。 -
最后但同样重要的是,您修改了
Parent.parent_list,所以Parent.parent_list和Derived.parent_list都引用同一个对象。所以Parent.parent_list现在包含"DERIVED"。您可能想为Derived创建一个副本:parent_list = Parent.parent_list + ["DERIVED"]。您的测试可能需要对此进行检查。
标签: python python-2.7 unit-testing mocking