Написание модульных тестов, которые могут получить доступ к приватному / защищенному состоянию - PullRequest
1 голос
/ 28 апреля 2020

Я использую Boost Test для юнит-тестов. У меня обычно есть структура прибора:

class ClassBeingTested
{
protected:
    int _x;             // Want to access this directly in my unit tests
};

struct TestFixture : public ClassBeingTested
{
    // I can access ClassBeingTested::_x here but it means i have to add getters for each test to call
    ClassBeingTested _bla;
};

Однако, даже если мой прибор наследует от ClassBeingTested или использует отношения друзей, я не могу получить доступ к закрытым / защищенным методам / состоянию из каждого отдельного теста:

BOOST_FIXTURE_TEST_CASE(test1, TestFixture)
{
    _bla.doSomething();
    BOOST_REQUIRE_EQUAL(_bla.x, 10);    // Compiler error. I cannot access ClassBeingTested::_x here
}

только прибор, что означает, что я должен добавить новый геттер (или тест) для каждого доступа, который я sh должен сделать.

Есть ли способ добиться этого? Я должен добавить методы getli c publi к ClassBeingTested, которые используются только тестами, что не идеально.

(Пожалуйста, не отвечайте на вопросы "test using интерфейс publi c", это не всегда возможно).

1 Ответ

2 голосов
/ 28 апреля 2020

Вы можете создать друга-тестового друга, struct ClassBeingTestedBuddy; с friend struct ClassBeingTestedBuddy; в class ClassBeingTested.

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

Это выглядело бы как ...

struct ClassBeingTestedBuddy {
    ClassBeingTested* obj;
    ClassBeingTestedBuddy(ClassBeingTested* obj_)
      : obj{obj_} {}
};

... плюс все, что вы хотели бы раскрыть.

Это всего лишь один из способов позволяя проверять мост к защищенным и закрытым данным и методам. Но поскольку весь код вашего проекта предназначен для тестирования, это разумный способ получить доступ к тестовому коду без чрезмерного инструментирования действительного кода.

...