首页 > 解决方案 > 如何在 CppUnitTest 框架中断言两个向量是否相等

问题描述

我正在尝试断言二维向量,如下所示

TEST_METHOD(TestCase1)
{
    std::vector<int> arr{2};
    int sum{ 2 };
    std::vector<std::vector<int>> subsets;
    std::vector<std::vector<int>> expected{ {2} };
    generate_subsets(subsets, arr, sum);
    Assert::AreEqual<std::vector<std::vector<int>>>(subsets, expected);
}

但它显示如下错误

Error - C2338 Test writer must define specialization of ToString<const 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 std::vector<class std::vector<int,class…

任何建议都会有很大帮助。

标签: assertstdvectormicrosoft-cpp-unit-test

解决方案


Assert::AreEqual想要std::wstring在失败的情况下将值转换为显示,即:

Assert failed. Expected:<some value> Actual:<some other value>

编译器会抱怨,因为您使用的类型没有内置转换。

一个快速的解决方法是使用Assert::IsTrue,因为它不会尝试将值转换为字符串:

Assert::IsTrue(subsets == expected, L"Unexpected value for <subsets>);

如果您要大量比较这些类型并希望在测试失败时显示实际值,那么您可以执行编译消息的建议并为该特定类型Assert::AreEqual创建覆盖:ToString

#include <CppUnitTestAssert.h>

namespace Microsoft {
    namespace VisualStudio {
        namespace CppUnitTestFramework {
            template<> static inline std::wstring ToString(const std::vector<std::vector<int>> &object)
            {
                // Insert some code here to convert <object> to wstring
                return std::wstring();
            }
        }
    }
}

推荐阅读