【发布时间】:2014-06-07 15:31:19
【问题描述】:
我试图掌握模拟对象的窍门,但似乎被一些非常基本的东西弄糊涂了。我正在尝试模拟对象 MyClass,然后对其一种方法进行单元测试。这是我的代码:
import mock
import unittest
class MyClass(object):
def __init__(self, a):
self.a = a
def add_two(self):
return self.a + 2
class TestMyClass(unittest.TestCase):
@mock.patch('__main__.MyClass')
def test_add_two(self, dummy_mock):
m_my_class = mock.Mock()
m_my_class.a = 10
result = m_my_class.add_two() # I would expect the result to be 12
import ipdb;ipdb.set_trace()
self.assert_equal(result, 12)
if __name__ == '__main__':
unittest.main()
在m_my_class.a = 10 中,我将a 的值设置为to,然后在m_my_class.add_two() 中添加2,我不应该得到12 吗?但是,result 是:
16 import ipdb;ipdb.set_trace()
---> 17 self.assert_equal(result, 12)
18
ipdb> result
<Mock name='mock.add_two()' id='18379792'>
我错过了什么?
既然我通过装饰器将类的位置传递给测试方法@mock.patch('__main__.MyClass'),那么mocked不应该拥有所有的方法吗?因为如果不是,那为什么我们在装饰器中包含什么类很重要?
编辑:
当我运行这段代码时,我仍然得到同样的结果。
class TestMyClass(unittest.TestCase):
@mock.patch('__main__.MyClass')
def test_add_two(self, dummy_mock):
dummy_mock.a = 10
result = dummy_mock.add_two()
import ipdb;ipdb.set_trace()
self.assert_equal(result, 12)
结果:
ipdb> result
<MagicMock name='MyClass.add_two()' id='38647312'>
【问题讨论】:
标签: python unit-testing mocking