我正在使用 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 文件仍然没有获得新条目。有人知道为什么它不起作用吗?
在这种特定情况下,我猜你的单元测试是在不同的路径中运行的,这就是为什么当你在 IDE 中运行它时文件将存在于不同的目录中。
也就是说,你的单元测试不应该写文件。你应该有一个不同的测试异常处理程序,一个你可以 assert 的,这样你的测试实际上可以说“这个 should 产生了一个日志条目”。这意味着您需要一种方法来写入一个容器per test。可能是一个内存存储,比如列表/向量或其他你可以查询的东西。