class 中已被模拟的模拟方法

Mocking method in class that is already mocked

我正在尝试为 class 设置一个方法的 return 值 我在嘲笑:

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 class 是有原因的。在我的实际场景中,有很多初始化代码。

如何模拟已被模拟的 class 的方法?

在你的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'}

通过覆盖实例的 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'}