Сейчас я занят написанием очереди на основе событий. Я хотел сделать несколько юнит-тестов, но я столкнулся с ошибкой. В Microsoft Visual Studio при создании проекта модульного теста вы должны реализовать эту функцию для каждого типа, для которого вы делаете утверждение:
namespace Microsoft
{
namespace VisualStudio
{
namespace CppUnitTestFramework
{
template<> static std::wstring ToString<T>>(const class T& t)
{
//code goes here
}
}
}
}
проблема в том, что очередь не изменяет переданный объект внутрь. из-за этого я хотел написать модульный тест, который проверял бы, что объект, на который указывает очередь, имеет тот же адрес, что и объект вне очереди. Я написал тест следующим образом:
TEST_METHOD(REGISTERED_PROCESSORS_HAVE_ACCURATE_ADDRESSES_IN_QUEUE_MANAGER)
{
QueueProcessor queue;
ActionProcessor processor;
processor.loadFromJson({ {actionProcessorProperties::QUEUE_NAME, "alpha"} });
queue.registerProcessor(&processor);
Assert::AreEqual(&processor, queue.processors["alpha"][0]);
}
я тогда получаю эту ошибку:
Test writer must define specialization of ToString<Q* q> for your class class std::basic_string<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> > __cdecl Microsoft::VisualStudio::CppUnitTestFramework::ToString<class ActionProcessor>(class ActionProcessor *).
так как мне реализовать ToString
на указателе? когда я пытаюсь поместить тип данных в компилятор жалуется. Кроме того, как мне затем отобразить указатель в виде строкового значения?
спасибо за помощь.
edit:
Я обнаружил, что модульный тест работает нормально, если вы конвертируете указатели до uintptr_t. Однако преобразование типа mid assert может испортить читабельность кода. Есть ли более чистое решение?
TEST_METHOD(REGISTERED_PROCESSORS_HAVE_ACCURATE_ADDRESSES_IN_QUEUE_MANAGER)
{
QueueProcessor queue;
ActionProcessor processor;
processor.loadFromJson({ {actionProcessorProperties::QUEUE_NAME, "alpha"} });
queue.registerProcessor(&processor);
Assert::AreEqual(reinterpret_cast<uintptr_t> (&processor),
reinterpret_cast<uintptr_t>(queue.processors["alpha"][0]));
}