小能豆

为什么没有引发 ValueError ?

python

我目前正在做 python 课的作业,需要一些帮助。我写了以下函数:

def get_funcs(funcs: dict, file_name: str, table_name: str) -> None:
    '''
    Read the given *.csv file, store the data inside the database and store the functions in a dict

    Args:
        functions dict: Dictionary to store the functions object
        file_name str: The file name of the csv-file with file extension
        table_name str: The name of the SQL table
    '''    

    global update_database

    try:
        if file_name == "test.csv" or file_name == "test":
            raise ValueError("The function for the test data is not neccessary.")
        elif file_name != "train.csv" and file_name != "train" and file_name != "ideal.csv" and file_name != "ideal":
            raise ValueError("Given a completly wrong / empty file or a directorys.")

        # store the complete path to the file in a variable
        complete_path = os.path.join(dataset_dir, file_name)
        # check file to be correct
        file_extension = os.path.splitext(file_name)[1]
        if file_extension == "":
            print_log(MessageType.Warn, "get_funcs", "Missing file extension. Added "".csv"" automatically!")
            complete_path += ".csv"        
        if not os.path.exists(complete_path):
            raise FileNotFoundError()

        # read csv file and store it in a data frame
        data = pd.read_csv(complete_path, sep=",")
        print_log(MessageType.Info, "get_funcs", "Successfully read \"" + file_name + "\"!")
    except PermissionError as error:
        print_log(MessageType.Error, "get_funcs", "Cannot open the given csv file!")
        return
    except Exception as error:
        print_log(MessageType.Error, "get_funcs", error)
        return

任务的一部分是编写单元测试。所以我写了以下内容:

import main
import unittest

class UnitTestPythonTask(unittest.TestCase):
    def test_check_test_function(self):
        '''
        Checks the file validation of the given .csv files
        '''
        self.assertRaises(ValueError, main.get_funcs({}, "test.csv", "TestFunction"))

测试失败,因为没有引发 ValueError。如果我设置一个断点并观察单个步骤,我可以看到 ValueError 被引发并被记录 ( print_log)。

我试图设置raise ValueError("Given a completly wrong / empty file or a directorys.")尝试的外部…除了…阻止,但没有运气。测试成功后,当我检查是否引发异常时,我添加了除 ValueError 之外的所有附加内容。也没有运气。

谁能告诉我,为什么尽管引发了 ValueError 测试还是失败?


阅读 102

收藏
2023-11-14

共1个答案

小能豆

在您的测试示例中,assertRaises方法需要接收一个可调用的对象(函数或方法)以及可调用对象发送的异常类型。get_funcs函数assertRaises不会捕

要测试是否引发了特with语句和selfself.assertRaises。这样可以确保在``with语句

以下是修改后的测试示例:

import main
import unittest

class UnitTestPythonTask(unittest.TestCase):
    def test_check_test_function(self):
        '''
        Checks the file validation of the given .csv files
        '''
        with self.assertRaises(ValueError):
            main.get_funcs({}, 
            main.get_funcs({},

            main.get_funcs
"test.csv", "TestFunction")

在此测试中,with self.assertRaises(ValueError)表示希望在with语句块中的代码触发您ValueError。如果在with语句块中的代码没有ValueError,测试将失败。

请确实get_funcs函数中引发异常的代码在测试中的with语句块内部。如果在get_funcs函数中引发异常的代码在try语句块外部,则异常将被捕获,导致测试失败。

2023-11-14