如何在 google 测试中读取 spdlog 输出

mik*_*ike 2 c++ googletest spdlog

我正在执行 spdlog 的最新提交(存在有关 std 输出的问题,显然已解决),并且正在将我的输出从 std::cout 切换到 spdlog。

我的谷歌测试重定向 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;
}
Run Code Online (Sandbox Code Playgroud)

然后在测试中使用如下;

doSomethingThatWritesToStdOut();
std::string teststr = buffer.str();
EXPECT_TRUE(teststr.find("Some output string") != std::string::npos);
Run Code Online (Sandbox Code Playgroud)

doSomethingThatWritesToStdOut当我将内容更改为时,这不起作用

spdlog::get("console")->debug("Some output string\n");

teststr值为空..如果我执行以下操作

 spdlog::get("console")->debug("Some output string\n");
 std::cout << "Some output string\n";
Run Code Online (Sandbox Code Playgroud)

然后我可以在 teststr.txt 中看到“某些输出字符串”的一个实例。如何捕获此记录器的输出(或更改记录器)以便我可以在谷歌测试中进行测试?

mik*_*ike 7

正如我在评论中提到的,由于之前的问题,我曾认为 spdlog 输出到 std::cout,但实际上这与 stdout 相关..(捂脸)

事实证明,这既美好又简单!通过使用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);
Run Code Online (Sandbox Code Playgroud)

哪里_oss是 a 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("");
Run Code Online (Sandbox Code Playgroud)

spdlog::debug使用等的现有代码spdlog::trace根本不需要更改。