我有以下代码test_A.py,它嘲笑MyClass.mymethod:
from unittest import main
from mocker import Mocker, MockerTestCase
Class test_A(MockerTestCase):
def setUp(self):
self.m=Mock()
MyClass.mymethod = self.m.mock()
self.m.result(None)
self.m.count(0,None)
self.m.replay()
def test_me(self):
#Do something about MyClass.method
def tearDown(self):
self.m.restore()
self.m.verify()
我还有另一个代码test_B.py,它不会模拟MyClass.mymethod:
Class test_B(MockerTestCase):
def setUp(self):
pass
def test_me(self):
#Do something about MyClass.method
def tearDown(self):
pass
但是,当我执行“nosetests test_A.py test_B.py”时,看起来在测试test_A.py并输入test_B.py之后,MyClass.mymethod仍然被模拟了。不知道为什么以及如何解决它。谢谢!
答案 0 :(得分:3)
该行:
MyClass.mymethod = self.m.mock()
确实用新对象替换MyClass.mymethod()
。对MyClass.mymethod
的所有后续引用都将是模拟对象,即使这些引用位于不同的类中。
您想要的是一种替换仅在MyClass.mymethod()
课程中有效的test_A
的方法。实现此目标的最简单方法是恢复mymethod
方法中的原始tearDown
:
Class test_A():
def setUp(self):
self.originalMyMethod = MyClass.mymethod
self.m=Mock()
MyClass.mymethod = self.m.mock()
self.m.result(None)
self.m.count(0,None)
self.m.replay()
def test_me(self):
# Do something about MyClass.mymethod
def tearDown(self):
self.m.restore()
self.m.verify()
MyClass.mymethod = self.originalMyMethod