Можно ли проверить, возвращает ли общий указатель nullptr в собственном модульном тесте?


Используя собственный модульный тест Visual Studio 2012, код не может быть скомпилирован при использовании общего указателя.

Мой код:

#include "stdafx.h"
#include "CppUnitTest.h"
#include "ParameterTest.h"

using namespace Microsoft::VisualStudio::CppUnitTestFramework;
using namespace MyParameter;

namespace MyParameterTests
{       
    TEST_CLASS(MyParameterTests)
    {
    public:

        TEST_METHOD(CheckParametersWithPathReturnsNotNull)
        {
            //Arrange
            Parameter parameter = Parameter();

            //Act
            std::shared_ptr<std::string> actual = parameter.CheckParameters("C:\Parameter.db");

            //Assert
            Assert::IsNotNull(actual, L"Should not return null", LINE_INFO());

        }

    };
}

Компилятор eror:

2>------ перестроить все начато: проект: MyParameterTests, конфигурация: Debug Win32 ------ 2 > stdafx.СРР 2 > ParameterTestTests.СРР 2>c:users\documentsvisual studio 2012projectsmyparametertestsparametertests.СРР(26): ошибка C2784: 'пустота Майкрософт::VisualStudio::CppUnitTestFramework::вы утверждаете::IsNotNull(константный Т *Тип wchar_t const и *,константный Майкрософт::VisualStudio::CppUnitTestFramework::__LineInfo *)' : не удалось вывести аргумент шаблон для 'const и Т *' с 'с std::shared_ptr' 2 > с 2> [ 2> _Ty=std:: строка 2> ] 2> c:program файлы (x86)microsoft visual studio 11.0vcunittestincludecppunittestassert.h (259): смотрите объявление 'Microsoft:: VisualStudio::CppUnitTestFramework::Assert:: IsNotNull'

1 4

1 ответ:

Вы должны заменить

Assert::IsNotNull(actual, L"Should not return null", LINE_INFO()); 

С

Assert::IsNotNull(actual.get(), L"Should not return null", LINE_INFO());

Действительно, утверждение хочет, чтобы указатель проверял, является ли он нулевым, но смарт-указатель строго говоря, не является указателем (это объект, который управляет указателем).