Можно ли проверить, возвращает ли общий указатель 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 ответ:
Вы должны заменить
Assert::IsNotNull(actual, L"Should not return null", LINE_INFO());
С
Assert::IsNotNull(actual.get(), L"Should not return null", LINE_INFO());
Действительно, утверждение хочет, чтобы указатель проверял, является ли он нулевым, но смарт-указатель строго говоря, не является указателем (это объект, который управляет указателем).