Инициализированный класс в 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
}
}
};
}
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
- Вызывается один раз для каждого модуля после выполнения всех тестов и очистки класса.