如何比较两个迭代器以在 VS2013 上进行单元测试?

How to compare two iterators for unit test on VS2013?

代码:

#include "stdafx.h"
#include "CppUnitTest.h"
#include <vector>

using namespace Microsoft::VisualStudio::CppUnitTestFramework;

namespace unit_test
{
    TEST_CLASS(test_iterator)
    {
    public:

        TEST_METHOD(vector_with_int)
        {
            std::vector<int> samples;
            Assert::AreEqual(samples.begin(), samples.begin());
        }

    };
}

编译时:

Error 1 error C2338: Test writer must define specialization of ToString for your class class std::basic_string,class std::allocator > __cdecl Microsoft::VisualStudio::CppUnitTestFramework::ToString > >>(const class std::_Vector_iterator > > &). c:\program files (x86)\microsoft visual studio 12.0\vc\unittest\include\cppunittestassert.h 66 1 unit_test

如何解决这个问题?我应该改用其他框架吗?

您可能希望从每个迭代器中减去 begin(如果它们是随机迭代器),因此您比较的是 size_type 偏移量而不是迭代器类型:

Assert::AreEqual(samples.begin() - samples.begin(), samples.begin() - samples.begin());

只需在测试前添加如下内容即可:

namespace Microsoft { namespace VisualStudio { namespace CppUnitTestFramework {

   using vecint_itr = typename std::vector<int>::iterator;

   template<> inline std::wstring ToString<vecint_itr>(vecint_itr const & t)
   {
      return L"vecint_itr"; // replace with string with whatever you like
   }

}}}

这会将一个 ToString 函数注入到 CppUnitTestFramework 中,这是将迭代器转换为可由测试框架显示的字符串值所必需的。这正是错误消息要求您执行的操作。