【发布时间】:2017-08-05 02:04:16
【问题描述】:
我正在测试一个函数,它读取文件、对内容进行操作并根据它看到的内容返回一个值。我测试的函数testme 位于module.py。我正在运行 python 2.7。我知道我可以做到这一点
import unittest
import module
from mock import patch, mock_open
TestTestMe(unittest.TestCase):
...
def test_test_me(self):
with patch('module.open', mock_open(read_data='1 2')) as _:
self.assertRaises(IndexError, module.testme, 'foo')
with patch('module.open', mock_open(read_data='1 2 3')) as _:
self.assertEquals(module.testme('foo'), 3)
等等
但是,我希望(主要是为了防止重复使用 with 语句,并且能够动态生成各种 read_data)能够使用 @patch 作为装饰器来定义我的 read_data 函数。像这样的东西。我不会重复类定义和导入。
def give_contents(x):
if x == 'correct':
return mock_open(read_data='1 2 3')
else:
return mock_open(read_data='a b c')
然后使用如下测试函数:
@patch(module.open, side_effect=give_contents)
def test_test_me(self):
self.assertEquals(module.testme('correct'), 3)
我不断遇到诸如
之类的 TypeErrorsTypeError: test_testme() takes exactly 1 argument (2 given)
但是我试图解决这个问题。这真让我抓狂。指导将不胜感激。如果您想要一些我可能省略的其他细节,请询问具体细节,我会提供这些。
编辑:按要求执行要测试的功能。很抱歉,我因为“不重要”而忽略了它,它显然应该在那里。
def testme(filepath):
with open(filepath, 'r') as f:
line = f.readline().strip().split()
return int(line[2])
【问题讨论】:
-
我不确定,因为你没有在你给我们的代码中包含任何出现的 test_testme 函数。但是,如果您使用的是
module.testme方法,您忘记在方法定义中声明字符串参数。根据您的反馈,我可能会将此作为答案。 -
请考虑不要在这里嘲笑。您最好将“文件”对象转换为参数并让其他未进行单元测试的代码打开文件。然后,您可以将某种字符串 IO 对象作为存根传入。即使你不能使用字符串 IO,你仍然可以只传递一个模拟作为参数。 (即使我使用了模拟,我也可能不会断言。)
-
@Alceste_ 我添加了实现。如果您写了完整的答案,那就太好了。
-
那么,我会的,虽然对于一个完整的答案来说似乎很短。
标签: python unit-testing testing mocking