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

时间:2015-03-16 14:49:26

标签: c++ visual-studio unit-testing visual-c++

代码:

#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());
        }

    };
}

编译时:

  

错误1错误C2338:测试编写者必须为您的类类std :: basic_string定义ToString的特化,类std :: allocator&gt; __cdecl Microsoft :: VisualStudio :: CppUnitTestFramework :: ToString&gt; &gt;&gt;(const class std :: _ Vector_iterator&gt;&gt;&amp;)。 c:\ program files(x86)\ microsoft visual studio 12.0 \ _vc \ unittest \ include \ cppunittestassert.h 66 1 unit_test

如何解决这个问题?我应该使用另一个框架吗?

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

在测试之前添加这样的东西:

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中,这需要将迭代器转换为可由测试框架显示的字符串值。这正是错误消息要求您做的事情。