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

问题描述 投票:0回答:1

我正在使用 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++ unit-testing exception logging
1个回答
0
投票

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

也就是说,你的单元测试不应该写文件。你应该有一个不同的测试异常处理程序,一个你可以 assert 的,这样你的测试实际上可以说“这个 should 产生了一个日志条目”。这意味着您需要一种方法来写入一个容器per test。可能是一个内存存储,比如列表/向量或其他你可以查询的东西。

© www.soinside.com 2019 - 2024. All rights reserved.