Почему насмешка по-прежнему эффективна после того, как в тестах на носу есть несколько тестов? - PullRequest
3 голосов
/ 14 декабря 2011

У меня есть следующий код 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

Однако, когда я делаю «тестирование носа test_A.py test_B.py», похоже, что после тестирования test_A.py и ввода test_B.py, MyClass.mymethod все еще копируется. Не уверен, почему и как обойти это. Спасибо!

1 Ответ

3 голосов
/ 14 декабря 2011

Строка:

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
...