我正在尝试为我嘲笑的类设置方法的返回值:
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类。在我的实际情况中,有很多初始化代码。
如何模拟已经被模拟的类的方法?
答案 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'}