Проблемы реализации специализации ToString для модульного тестирования c ++ - PullRequest
0 голосов
/ 17 апреля 2020

Сейчас я занят написанием очереди на основе событий. Я хотел сделать несколько юнит-тестов, но я столкнулся с ошибкой. В 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]));
}

1 Ответ

0 голосов
/ 18 апреля 2020

Так как никто, кажется, не отвечает на это, я отмечу мои изменения как правильные. Возможно, способ сделать это - преобразовать указатели в типы uintptr_t. Код ниже устраняет проблему:

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]));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...