如何比较两个迭代器以在 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 中,这是将迭代器转换为可由测试框架显示的字符串值所必需的。这正是错误消息要求您执行的操作。
代码:
#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 中,这是将迭代器转换为可由测试框架显示的字符串值所必需的。这正是错误消息要求您执行的操作。