C++写入.log文件在单元测试项目中不起作用

C++ writing into .log file doesn't work in unit test project

提问人:Akito The Duck 提问时间:5/10/2023 最后编辑:Akito The Duck 更新时间:5/10/2023 访问量:52

问:

我正在使用 Visual Studio、C++、sqlapi 和 Microsoft C++ 单元测试框架。

我在我的主项目中编写了一个简单的方法,用于在异常出现时将一些错误写入.log文件。当我捕获 SAException 时,该方法正在调用。

void LogException(const SAException& e)
    {
        auto now = system_clock::now();
        auto now_c = system_clock::to_time_t(now);

        stringstream ss;
        ss << put_time(localtime(&now_c), "%Y-%m-%d %H:%M:%S") << "\n" << (const char*)e.ErrText() << "\n\n";
        ofstream logfile("exceptions.log", ios_base::app);cout << put_time(localtime(&now_c), "%Y-%m-%d %H:%M:%S") << "\n" << (const char*)e.ErrText() << "\n\n";
        logfile << ss.str();
        logfile.close();
    }

就我只在 Visual Studio 中运行项目而言,一切都很好,.log文件得到了一些文本。现在,我正在使用第二个项目和Microsoft C++单元测试框架,并对我的方法进行一些单元测试。当我现在运行测试时,.log文件没有获得新条目,但测试本身一如既往地工作正常。

一种测试方法,其中.log文件应获取新条目。

TEST_METHOD(openConnnectionException)
        {
            myDb->initParameter("dsn", "user", "pw", "client", "db");
            Assert::IsTrue(myDb->openConnection() == -1);
        }

openConnection() 方法

int openConnection()
    {
        try
        {
            //trying to open the connection
        }
        catch (SAException& sae)
        {
            cout << "Error opening database. Check parameters or contact an administrator\n";
            LogException(sae);
            return -1;
        }
    };

我的代码将通过 catch 块和 LogException() 方法为我提供正确的返回值,但.log文件仍然没有获得新条目。有人知道为什么它不起作用?

C++ 单元测试 异常 日志记录

评论


答:

0赞 nvoigt 5/10/2023 #1

在这种特定情况下,我猜您的单元测试是在不同的路径中运行的,这就是为什么当您在 IDE 中运行该文件时,该文件将存在于不同的目录中。

也就是说,单元测试不应写入文件。对于测试的异常,您应该有一个不同的处理程序,您可以断言该处理程序,以便您的测试实际上可以说“这应该生成一个日志条目”。这意味着您需要一种方法来在每次测试中写入一个容器。可能是内存中的存储,例如列表/向量或其他可以查询的东西。