2017-08-07 125 views
0

我在过去的6个小时里阅读过很多文章,但我仍然不明白模拟和单元测试。我想单元测试一个打开的函数,我如何正确地做到这一点?如何进行单元测试和模拟开放功能

我也担心我的大部分代码使用外部文件进行数据导入和操作。我明白我需要嘲笑他们进行测试,但我正在努力理解如何前进。

请多多指教。谢谢你在前进

prototype5.py

import os 
import sys 
import io 
import pandas 
pandas.set_option('display.width', None) 

def openSetupConfig (a): 
""" 
SUMMARY 
Read setup file 
    setup file will ONLY hold the file path of the working directory 
:param a: str 
:return: contents of the file stored as str 
""" 
try: 
    setupConfig = open(a, "r") 
    return setupConfig.read() 

except Exception as ve: 
    ve = (str(ve) + "\n\nPlease ensure setup file " + str(a) + " is available") 
    sys.exit(ve) 
dirPath = openSetupConfig("Setup.dat") 

test_prototype5.py

import prototype5 
import unittest 

class TEST_openSetupConfig (unittest.TestCase): 
""" 
Test the openSetupConfig function from the prototype 5 library 
""" 
def test_open_correct_file(self): 
    result = prototype5.openSetupConfig("Setup.dat") 
    self.assertTrue(result) 


if __name__ == '__main__': 
unittest.main() 

回答

0

所以经验法则是嘲笑,存根或假的所有外部依赖的方法/正在测试的功能。重点是单独测试逻辑。所以在你的情况下,你想要测试它可以打开一个文件或者记录一条错误信息,如果它无法打开的话。

import unittest 
from mock import patch 

from prototype5 import openSetupConfig # you don't want to run the whole file 
import __builtin__ # needed to mock open 

def test_openSetupConfig_with_valid_file(self): 
    """ 
    It should return file contents when passed a valid file. 
    """ 
    expect = 'fake_contents' 
    with patch('__builtin__.open', return_value=expect) as mock_open: 
     actual = openSetupConfig("Setup.dat") 
     self.assertEqual(expect, actual) 
     mock_open.assert_called() 

@patch('prototype5.sys.exit') 
def test_openSetupConfig_with_invalid_file(self, mock_exit): 
    """ 
    It should log an error and exit when passed an invalid file. 
    """ 
    with patch('__builtin__.open', side_effect=FileNotFoundError) as mock_open: 
     openSetupConfig('foo') 
     mock_exit.assert_called() 
相关问题