Насмешка над методом класса, который используется через экземпляр - PullRequest
10 голосов
/ 16 марта 2012

Я пытаюсь пропатчить метод класса, используя макет, как описано в документации . Сам объект Mock работает нормально, но его методы не работают: например, их атрибуты, такие как call_count, не обновляются, даже если атрибут method_calls объекта класса Mock есть. Что еще более важно, их атрибут return_value игнорируется:

class Lib:
    """In my actual program, a module that I import"""
    def method(self):
        return "real"

class User:
    """The class I want to test"""
    def run(self):
        l = Lib()
        return l.method()

with patch("__main__.Lib") as mock:
    #mock.return_value = "bla" # This works
    mock.method.return_value = "mock"
    u = User()
    print(u.run())

>>> 
mock
<MagicMock name='Lib().method()' id='39868624'>

Что я здесь не так делаю?

EDIT: передача класса Mock через конструктор также не работает, поэтому это на самом деле не связано с функцией patch.

Ответы [ 3 ]

17 голосов
/ 16 марта 2012

Я обнаружил свою ошибку: чтобы настроить методы экземпляров моего макета, я должен использовать mock().method вместо mock.method.

class Lib:
    """In my actual program, a module that I import"""
    def method(self):
        return "real"

class User:
    """The class I want to test"""
    def run(self):
        l = Lib()
        return l.method()

with patch("__main__.Lib") as mock:
    #mock.return_value = "bla" # This works
    mock().method.return_value = "mock"
    u = User()
    print(u.run())
1 голос
/ 03 июня 2016

Я высмеиваю методы класса следующим образом:

def raiser(*args, **kwargs):
    raise forms.ValidationError('foo')
with mock.patch.object(mylib.Commands, 'my_class_method', classmethod(raiser)):
    response=self.admin_client.get(url, data=dict(term='+1000'))
1 голос
/ 16 марта 2012
from mock import *

class Lib:
    """In my actual program, a module that I import"""
    def method(self):
        return "real"

class User:
    """The class I want to test"""
    def run(self, m):

        return m.method()

with patch("__main__.Lib") as mock:
    #mock.return_value = "bla" # This works
    mock.method.return_value = "mock"

    print User().run(mock)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...