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'}
我正在尝试为 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'}