我正在尝试为以下功能创建单元测试:
=IF(MOD((ROW()-ROW($I$1)),49)=0;AVERAGE(I1:I36);"")
但是,我无法成功创建包含文件的假目录,以使该功能正常工作而不是错误。
以下是我到目前为止的内容,但它不适合我,我不知道如何将“file_im_looking_for”作为伪目录中的文件。
def my_function(path):
#Search files at the given path
for file in os.listdir(path):
if file.endswith(".json"):
#Search for file i'm looking for
if file == "file_im_looking_for.json":
#Open file
os.chdir(path)
json_file=json.load(open(file))
print json_file["name"]
任何有关我出错的建议或其他想法来解决这个问题都值得赞赏!
答案 0 :(得分:3)
首先,您忘记将模拟对象传递给测试函数。在测试中使用mock的正确方法应该是这样的。
@mock.patch('my_module.os')
def test_my_function(self, mock_path):
无论如何,你不应该嘲笑endswith
,而是listdir
。下面的代码段就是一个例子,可以为您提供帮助。
<强> app.py 强>
def check_files(path):
files = []
for _file in os.listdir(path):
if _file.endswith('.json'):
files.append(_file)
return files
<强> test_app.py 强>
import unittest
import mock
from app import check_files
class TestCheckFile(unittest.TestCase):
@mock.patch('app.os.listdir')
def test_check_file_should_succeed(self, mock_listdir):
mock_listdir.return_value = ['a.json', 'b.json', 'c.json', 'd.txt']
files = check_files('.')
self.assertEqual(3, len(files))
@mock.patch('app.os.listdir')
def test_check_file_should_fail(self, mock_listdir):
mock_listdir.return_value = ['a.json', 'b.json', 'c.json', 'd.txt']
files = check_files('.')
self.assertNotEqual(2, len(files))
if __name__ == '__main__':
unittest.main()
修改:在评论中回答您的问题,您需要嘲笑应用中的json.loads
和open
。
@mock.patch('converter.open')
@mock.patch('converter.json.loads')
@mock.patch('converter.os.listdir')
def test_check_file_load_json_should_succeed(self, mock_listdir, mock_json_loads, mock_open):
mock_listdir.return_value = ['a.json', 'file_im_looking_for.json', 'd.txt']
mock_json_loads.return_value = [{"name": "test_json_file", "type": "General"}]
files = check_files('.')
self.assertEqual(1, len(files))
但请记住!如果你太宽泛或难以维护,也许重构你的API应该是一个好主意。