类中已经模拟的模拟方法

时间:2020-10-26 20:33:27

标签: python python-unittest

我正在尝试为我嘲笑的类设置方法的返回值:

foo.py

class Foo:
    def bar(self):
        return {'a': 'b', 'c': 'd'}

class Beef:
    def __init__(self):
        self.foo = Foo()

    def run(self):
        val = self.foo.bar()
        return val['a']
test_foo.py

import unittest
from unittest.mock import patch

from foo import Beef

class TestBeef(unittest.TestCase):
    @patch('foo.Foo')
    def test_run(self, mock_foo):
        mock_foo.bar.return_value = {'a': 'x'}  # how to do this?
        beef = Beef()
        assert result == {'a': 'x'}

这无法模拟该方法。 由于这是一个简化的示例,因此有一个原因需要模拟整个Foo类。在我的实际情况中,有很多初始化代码。

如何模拟已经被模拟的类的方法?

2 个答案:

答案 0 :(得分:0)

在您的test_foo.py中:

import unittest
from unittest import mock

from foo import Beef, Foo

class TestBeef(unittest.TestCase):
  
    def test_run(self):
        mock.object.patch(Foo, 'bar', return_value={'a': 'x'})
        beef = Beef()
        assert result == {'a': 'x'}

答案 1 :(得分:0)

通过覆盖实例的foo的方法来解决此问题

import unittest
from unittest.mock import patch

from foo import Beef

class TestBeef(unittest.TestCase):
    @patch('foo.Foo')
    def test_run(self, mock_foo):
        beef = Beef()
        beef.foo.bar.return_value = {'a': 'x'}
        assert result == {'a': 'x'}