如何在 google 测试中读取 spdlog 输出
How can I read spdlog output in a google test
我正在进行 spdlog 的最新提交(有一个关于 std 输出的 issue,显然已解决),并且正在将我的输出从 std::cout 切换到 spdlog。
我的 google 测试重定向 std::cout 所以我可以检查存根函数的输出:
class MyTest : public testing::Test
{
protected:
void SetUp() override
{
sbuf = std::cout.rdbuf();
std::cout.rdbuf(buffer.rdbuf());
auto console = spdlog::stdout_color_mt("console");
auto err_logger = spdlog::stderr_color_mt("stderr");
}
void TearDown() override
{
std::cout.rdbuf(sbuf);
}
std::stringstream buffer;
std::streambuf* sbuf;
}
然后在测试中使用如下;
doSomethingThatWritesToStdOut();
std::string teststr = buffer.str();
EXPECT_TRUE(teststr.find("Some output string") != std::string::npos);
当我将 doSomethingThatWritesToStdOut
的内容更改为
时,这不起作用
spdlog::get("console")->debug("Some output string\n");
teststr
值为空..
如果我执行以下操作
spdlog::get("console")->debug("Some output string\n");
std::cout << "Some output string\n";
然后我可以在 teststr 中看到一个“Some output string”的实例。我如何捕获此记录器的输出(或更改记录器)以便我可以在 google 测试中进行测试?
正如我在评论中提到的,由于较早的问题,我曾认为 spdlog 输出到 std::cout,但实际上这与标准输出有关..(facepalm)
事实证明,这既好又简单!通过使用ostream_sink,可以将输出发送到指定的ostream;
我在我的测试 SetUp() 函数中设置了一个记录器,如下所示
auto ostream_logger = spdlog::get("gtest_logger");
if (!ostream_logger)
{
auto ostream_sink = std::make_shared<spdlog::sinks::ostream_sink_st>(_oss);
ostream_logger = std::make_shared<spdlog::logger>("gtest_logger", ostream_sink);
ostream_logger->set_pattern(">%v<");
ostream_logger->set_level(spdlog::level::debug);
}
spdlog::set_default_logger(ostream_logger);
其中 _oss
是 std::ostringstream
。
那我测试就是看_oss的内容,每次查完就清空:
std::string test = _oss.str();
// check the derived class is constructed
EXPECT_TRUE(test.find("Constructing test class") != std::string::npos);
_oss.str("");
使用 spdlog::debug
、spdlog::trace
等的现有代码根本不需要更改。
我正在进行 spdlog 的最新提交(有一个关于 std 输出的 issue,显然已解决),并且正在将我的输出从 std::cout 切换到 spdlog。
我的 google 测试重定向 std::cout 所以我可以检查存根函数的输出:
class MyTest : public testing::Test
{
protected:
void SetUp() override
{
sbuf = std::cout.rdbuf();
std::cout.rdbuf(buffer.rdbuf());
auto console = spdlog::stdout_color_mt("console");
auto err_logger = spdlog::stderr_color_mt("stderr");
}
void TearDown() override
{
std::cout.rdbuf(sbuf);
}
std::stringstream buffer;
std::streambuf* sbuf;
}
然后在测试中使用如下;
doSomethingThatWritesToStdOut();
std::string teststr = buffer.str();
EXPECT_TRUE(teststr.find("Some output string") != std::string::npos);
当我将 doSomethingThatWritesToStdOut
的内容更改为
spdlog::get("console")->debug("Some output string\n");
teststr
值为空..
如果我执行以下操作
spdlog::get("console")->debug("Some output string\n");
std::cout << "Some output string\n";
然后我可以在 teststr 中看到一个“Some output string”的实例。我如何捕获此记录器的输出(或更改记录器)以便我可以在 google 测试中进行测试?
正如我在评论中提到的,由于较早的问题,我曾认为 spdlog 输出到 std::cout,但实际上这与标准输出有关..(facepalm)
事实证明,这既好又简单!通过使用ostream_sink,可以将输出发送到指定的ostream;
我在我的测试 SetUp() 函数中设置了一个记录器,如下所示
auto ostream_logger = spdlog::get("gtest_logger");
if (!ostream_logger)
{
auto ostream_sink = std::make_shared<spdlog::sinks::ostream_sink_st>(_oss);
ostream_logger = std::make_shared<spdlog::logger>("gtest_logger", ostream_sink);
ostream_logger->set_pattern(">%v<");
ostream_logger->set_level(spdlog::level::debug);
}
spdlog::set_default_logger(ostream_logger);
其中 _oss
是 std::ostringstream
。
那我测试就是看_oss的内容,每次查完就清空:
std::string test = _oss.str();
// check the derived class is constructed
EXPECT_TRUE(test.find("Constructing test class") != std::string::npos);
_oss.str("");
使用 spdlog::debug
、spdlog::trace
等的现有代码根本不需要更改。