Meh*_*omi 57 python python-unittest magicmock
我有一个python文件a.py
,其中包含两个类A
和B
.
class A(object):
def method_a(self):
return "Class A method a"
class B(object):
def method_b(self):
a = A()
print a.method_a()
Run Code Online (Sandbox Code Playgroud)
我想通过嘲笑method_b
在课堂上B
进行单元测试A
.以下是testa.py
用于此目的的文件内容:
import unittest
import mock
import a
class TestB(unittest.TestCase):
@mock.patch('a.A')
def test_method_b(self, mock_a):
mock_a.method_a.return_value = 'Mocked A'
b = a.B()
b.method_b()
if __name__ == '__main__':
unittest.main()
Run Code Online (Sandbox Code Playgroud)
我希望得到Mocked A
输出.但我得到的是:
<MagicMock name='A().method_a()' id='4326621392'>
Run Code Online (Sandbox Code Playgroud)
我哪里做错了?
jon*_*rpe 60
当你@mock.patch('a.A')
,你正在替换A
测试代码中的类mock_a
.
在B.method_b
你接盘a = A()
,这是现在a = mock_a()
-即a
是return_value
的mock_a
.由于您没有指定此值,因此它是常规值MagicMock
; 这也没有配置,因此MagicMock
在调用方法时会得到默认响应(又是另一个).
相反,你要配置的return_value
的mock_a
有适当的方法,你可以做两种:
mock_a().method_a.return_value = 'Mocked A'
# ^ note parentheses
Run Code Online (Sandbox Code Playgroud)
或者,或许更明确:
mock_a.return_value.method_a.return_value = 'Mocked A'
Run Code Online (Sandbox Code Playgroud)
您的代码将在这种情况下工作a = A
(分配类,而不是创建实例),因为那样a.method_a()
会触发您的mock方法.
归档时间: |
|
查看次数: |
25352 次 |
最近记录: |