Инициализированный класс в TEST_METHOD_INITIALIZE в CppUnitTestFramework теряет ссылку на указатель

Я пишу контроллер контроллера класса робота, в котором я использую структуру Axis для каждого из 4 управляемых двигателей.

Для каждого теста я хочу сбросить все, поэтому я создал указатель в классе, который меняется на новый контроллер перед каждым методом теста. Инициализация отлично работает в TEST_METHOD_INITIALIZE, но после вызова любого TEST_METHOD программа, похоже, сбрасывает указатели Axis.

Спасибо за вашу помощь!

Изменить: После дальнейшего анализа у меня есть теория, что инициализированные объекты Оси Ось init_mx удаляются после завершения метода.

Edit2: я думаю, что это немного более сложная проблема, подобная этой: указатель на локальную переменную в C++. Тем не менее, я не нашел способа сброса переменных Axis для каждого метода без фактического сброса каждой переменной в нем.

using namespace Microsoft::VisualStudio::CppUnitTestFramework;
...
namespace UnitTest
{

    TEST_CLASS(UnitTestController)
    {
    public:
        Controller* controller;
        struct Axis *mx, *my, *mz, *mg;

        TEST_METHOD_INITIALIZE(methodName)
        {
            Axis init_mx(50), init_my(50), init_mz(50), init_mg(5);         
            mx = &init_mx;
            my = &init_my;
            mz = &init_mz;
            mg = &init_mg;
            Controller init_controller(mx, my, mz, mg);
            controller = &init_controller;

        }
        ...
        TEST_METHOD(id_3_next_mode)
        {
            mx->position = 5; 
            controller->getAxisPositionMx();              
            //Axis in pointers got reset and therefore have no pointers to the 
            //provided structs from TEST_METHOD_INITIALIZE

        }

        }

    };
}

Controller.h (выдержка):

private:
struct Axis *mx, *my, *mz, *mg;

Controller.cpp (отрывок)

Controller::Controller(Axis *mx_in, Axis *my_in, Axis *mz_in, Axis *mg_in)
{
    mx = mx_in;
    my = my_in;
    mz = mz_in;
    mg = mg_in;
}

0 ответов

Вы нашли исходную ошибку, но я думаю, что стоит указать некоторые детали того, как тестовые модули, классы, методы и специальные методы инициализации / очистки предназначены для работы.

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

TEST_CLASS(UnitTestController)
{
public:
    struct Axis mx, my, mz, mg;
    Controller controller;

    // Define a constructor to initialize the class variables
    UnitTestController() : 
        mx(50), my(50), mz(50), mg(50),
        controller(mx, my, mz, mg)
    {
    }

    TEST_METHOD(id_3_next_mode)
    {
        mx.position = 5; 
        controller.getAxisPositionMx();              
    }
};

Если вы хотите, чтобы переменная сохранялась между тестами, вы можете поместить ее вне класса теста.

namespace UnitTest {

    SomeClass moduleVar1;

    TEST_CLASS(UnitTestClass)
    {
    public:

        TEST_METHOD(TestMethod1)
        {
           Assert::IsTrue(moduleVar1.SomeMethod());
        }

        TEST_METHOD(TestMethod2)
        {
           Assert::IsFalse(moduleVar1.SomeOtherMethod());
        }
    };
} 

Инфраструктура также предоставляет следующие функции инициализации и очистки, которые можно использовать для манипулирования тестовой средой и приборами:

  • TEST_METHOD_INITIALIZE - Вызывается один раз перед запуском каждого метода испытаний.
  • TEST_METHOD_CLEANUP - Вызывается один раз после запуска каждого метода испытаний.
  • TEST_CLASS_INITIALIZE - Вызывается один раз на модуль перед запуском любых тестов, принадлежащих этому классу.
  • TEST_CLASS_CLEANUP - Вызывается один раз для каждого модуля после запуска всех тестов, принадлежащих этому классу.
  • TEST_MODULE_INITIALIZE - Вызывается один раз на модуль перед запуском любых тестов или инициализаторов классов.
  • TEST_MODULE_CLEANUP - Вызывается один раз для каждого модуля после выполнения всех тестов и очистки класса.
Другие вопросы по тегам