Google testing: как обработать исключения из SetUp() / TearDown()? - C++

279
20 января 2018, 01:11

Например я хочу проверить умный указатель. И убедится что локальный объект уничтожается при выходе из своего поля видимости:

#include  <stdexcept>
#include  <iostream>
#include  <memory>
#include "gtest/gtest.h"

class FooTest: public ::testing::Test {
public:
    void SetUp() {}

    void TearDown() {
        std::cout << mMsg << " deleted" << std::endl;
        throw std::runtime_error(mMsg);
    }
    void SetLog(std::string msg) {
        mMsg = msg;
    }
    void TestBody() {}
private:
    std::string mMsg;
};
 // Проверяю генерится ли исключение
TEST_F(FooTest, TestExistException) {
    EXPECT_ANY_THROW(
        {
            std::shared_ptr<FooTest> shrPtr(new  FooTest());
            shrPtr = std::make_shared<FooTest>();
            shrPtr->SetLog("local object");
        }
    );
}
std::shared_ptr<FooTest> shrPtrOther(new  FooTest());
// Проверяю содержание сообщения
TEST_F(FooTest, TestLogException) {
    shrPtrOther = std::make_shared<FooTest>();
    shrPtrOther->SetLog("other object");
    try {
        { // begin scope of shrPtr
            std::shared_ptr<FooTest> shrPtr(new FooTest());
            shrPtr = std::make_shared<FooTest>();
            shrPtr->SetLog("local object");
        } // end scope of shrPtr
    } catch (std::exception &e) {
        EXPECT_EQ(e.what(), (std::string )"local object");
    }
}

В консоли получаю:

Running main() from gtest_main.cc
[==========] Running 2 tests from 1 test case.
[----------] Global test environment set-up.
[----------] 2 tests from FooTest
[ RUN      ] FooTest.TestExistException
../src/testDel.cpp:44: Failure
Expected: { std::shared_ptr<FooTest> shrPtr(new FooTest()); shrPtr = std::make_shared<FooTest>(); shrPtr->SetLog("local object"); } throws an exception.
  Actual: it doesn't.
 deleted
unknown file: Failure
C++ exception with description "" thrown in TearDown().
[  FAILED  ] FooTest.TestExistException (18 ms)
[ RUN      ] FooTest.TestLogException
 deleted
unknown file: Failure
C++ exception with description "" thrown in TearDown().
[  FAILED  ] FooTest.TestLogException (0 ms)
[----------] 2 tests from FooTest (152 ms total)
[----------] Global test environment tear-down
[==========] 2 tests from 1 test case ran. (154 ms total)
[  PASSED  ] 0 tests.
[  FAILED  ] 2 tests, listed below:
[  FAILED  ] FooTest.TestExistException
[  FAILED  ] FooTest.TestLogException
 2 FAILED TESTS

Основной вопрос заключается в том, как обработать исключения из TearDown() ("деструктора"), с целью автоматизировать проверку возникающих сообщений.

Answer 1

Вы не правильно используете fixture. Их смысл в том, чтобы подготавливать / подчищать данные для теста избегая тем самым копипасты в каждом тесте. Самостоятельно создавать экземпляры таких классов не следует. Метод TearDown предназначен для потенциально кидающей исключения подчистки тестовых данных, чтобы избежать исключений в деструкторе. В этом методе не следует продолжать сам тест, или, тем более, специально кидать исключения.

READ ALSO
Проблема с арифметическими операциями c++

Проблема с арифметическими операциями c++

Доброго времени суток! Столкнулся (похоже) с какой-то низкоуровневой проблемой преобразования типов (или еще чего-то)

371
Идентификатор printf не определён

Идентификатор printf не определён

Выполняю задание по алгоритмам компьютерной графикиВ самом начале возник очередной затуп, так как 2 printf в коде выделяются как неопределённые...

968
Вывод элементов из односвязного списка

Вывод элементов из односвязного списка

Создала линейный односвязный списокКак его вывести?

395