为什么在鼻子测试中存在代码后,模拟仍然有效?

时间:2011-12-14 05:06:40

标签: python nosetests

我有以下代码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仍然被模拟了。不知道为什么以及如何解决它。谢谢!

1 个答案:

答案 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