GoogleTest: EXPECT_THROW ловит другой тип? - PullRequest
0 голосов
/ 02 октября 2018

Я пытаюсь проверить EXPECT_THROW, как показано ниже.

#include <gtest/gtest.h>
int Foo(int a, int b){
    if (a == 0 || b == 0){
        throw "don't do that";
    }
    int c = a % b;
    if (c == 0)
        return b;
    return Foo(b, c);
}
TEST(FooTest, Throw2){
    EXPECT_THROW(Foo(0,0), char*);
}
int main(int argc, char* argv[]){
    testing::InitGoogleTest(&argc,argv);
    return RUN_ALL_TESTS();
}

Я ожидаю, что 'Throw2' должен быть успешным.Но он дает эту информацию об ошибке:

Expected: Foo(0,0) throws an exception of type char*.
Actual: it throws a different type.

Так что же здесь выбрасывается?

1 Ответ

0 голосов
/ 02 октября 2018

"don't do that" - строковый литерал, тип которого - const char[14].Как таковой он может только уменьшиться до const char*, а не char*, как вы ожидаете.

Таким образом, изменение вашего теста на EXPECT_THROW(Foo(0,0), const char*); должно сделать его успешным.

В качестве отступления, я бы не стал исключать в этом случае.ИМО было бы лучше просто вернуть std::optional (или boost::optional, если C ++ 17 недоступен).Получение неправильных входных данных - это не то, что я считаю достаточно исключительным, чтобы оправдать исключение.

И если бы мне пришлось выбросить исключение, то создание стандартного типа исключения загружается лучше строкового литерала.В этом случае std::domain_error представляется целесообразным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...