GTEST - квалифицированное имя не называет класс до токена ':' - PullRequest
0 голосов
/ 12 декабря 2018

Вот пример кода:

#include <gtest/gtest.h>
#include <gmock/gmock.h>

namespace A { namespace B {

struct MyFixture: public ::testing::Test
{
};

}}

TEST_F(A::B::MyFixture, Test1)
{

}

int main(int argc, char** argv)
{
    ::testing::InitGoogleMock(&argc, argv);
    return RUN_ALL_TESTS();
}

Я получаю следующую ошибку:

gtest-internal.h:1255: error: qualified name does not name a class before ‘:’ token
gtest.h:2305: in expansion of macro ‘GTEST_TEST_’
main.cpp:29: in expansion of macro ‘TEST_F’
gtest-internal.h:1255: error: expected ‘{’ before ‘:’ token
gtest.h:2305: in expansion of macro ‘GTEST_TEST_’
main.cpp:29: in expansion of macro ‘TEST_F’
gtest-internal.h:1255: error: expected unqualified-id before ‘:’ token
gtest.h:2305: in expansion of macro ‘GTEST_TEST_’
main.cpp:29: in expansion of macro ‘TEST_F’

Как это исправить?Должен ли TEST_F находиться в том же пространстве имен, что и прибор?

1 Ответ

0 голосов
/ 12 декабря 2018

Из TEST_F документации:

Первый параметр - это имя класса тестовых приборов, которое также удваивается как имя тестового примера.

Первый параметриспользуется как часть имени класса теста, поэтому размещение в нем составного идентификатора приводит к расширению макроса TEST_F(A::B::MyFixture, Test1) до недопустимого кода:

class A::B::MyFixture_Test1_Test: public A::B::MyFixture
{
    public: A::B::MyFixture_Test1_Test()
    {
    }
    private: virtual void TestBody();

    static ::testing::TestInfo* const test_info_;

    A::B::MyFixture_Test1_Test(A::B::MyFixture_Test1_Test const &) = delete;

    void operator=(A::B::MyFixture_Test1_Test const &) = delete;
};

::testing::TestInfo* const A::B::MyFixture_Test1_Test::test_info_ = ::testing::internal::MakeAndRegisterTestInfo
(
    "A::B::MyFixture"
,   "Test1"
,   nullptr
,   nullptr
,   ::testing::internal::CodeLocation
    (
        "d:\\projects\\googletest-master\\googletest\\src\\gtest-all.cc", 60
    )
,   (::testing::internal::GetTypeId<A::B::MyFixture>())
,   A::B::MyFixture::SetUpTestCase
,   A::B::MyFixture::TearDownTestCase
,   new ::testing::internal::TestFactoryImpl<A::B::MyFixture_Test1_Test>
);

void A::B::MyFixture_Test1_Test::TestBody()
{

}

Это один из многих недостатков основанных на макросах структур модульных тестов.

Если вы хотите использовать осветитель из другого пространства имен, вам нужно будет перенести его имя в текущее пространство имен, а затем использовать незавершенное имя в макросе:

using A::B::MyFixture;

TEST_F(MyFixture, Test1)
{
… 
...