我正在测试一个读取文件,对内容进行操作并根据其所见返回值的函数。我测试的功能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)
我不断遇到TypeErrors
TypeError: 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方法,则您忘记在方法定义中声明字符串参数。根据您的反馈,我可能会给出答案。
编辑:我不是当场,因为你忘记的论点是自我。
显然,这对您有用,因此这是应答的答案。
假设您所讨论的module.testme方法是一个看起来像这样的函数:
TestTestMe(unittest.TestCase):
...
def testme(filepath):
with open(filepath, 'r') as f:
line = f.readline().strip().split()
return int(line[2])
但是,此功能实际上是一种方法,因为您正在从对象访问它。 (执行
module.testme('foo')
),因此,赋予调用的第一个参数将始终是隐式self
。因此发生的事情是,您的函数期望一个参数,一个字符串('foo'),但是即使self不是显式的,也会给出两个参数:'(self,'foo')'。
因此,该错误表明您收到的参数超出了您的要求。
纠正非常简单:将
self
添加到testme的预期参数中。然后变成:
def testme(self, filepath):
with open(filepath, 'r') as f:
line = f.readline().strip().split()
return int(line[2])
希望这会有所帮助。实际上,有关参数数量的错误通常是由于这种被遗忘的细节所致。尽管您不需要self,但它始终会作为第一个位置参数(在python中)传递。
祝你今天愉快 !
PS:对不起,有些奇怪的英语措词和重复。