2017-04-03 1 views
0

J'ai un code que je voudrais tester. En cas de mauvais paramètres, j'ai accès à un vecteur au-delà de sa portée. Je veux tester pour cette condition. Est-il possible de tester ce code avec CppUnitTestFramework?CppUnitTestFramework et test pour "indice de vecteur hors plage"

#if _ITERATOR_DEBUG_LEVEL == 2 
     if (size() <= _Pos) 
      { // report error 
      _DEBUG_ERROR("vector subscript out of range"); 
      _SCL_SECURE_OUT_OF_RANGE; 
      } 

#elif _ITERATOR_DEBUG_LEVEL == 1 
     _SCL_SECURE_VALIDATE_RANGE(_Pos < size()); 
#endif /* _ITERATOR_DEBUG_LEVEL */ 

Répondre

1

Si vous voulez tester quelque chose, cela signifie que vous attendez un comportement prévisible. L'utilisation de vector :: operator [] pour accéder à des éléments hors de portée fait exploser un comportement indéfini. Dans le cas de Debug MS VS build, vous pouvez obtenir une assertion, mais dans Release, tout peut arriver. Donc tester l'opérateur [] est inutile et c'est en fait la responsabilité du développeur de s'assurer que la valeur de l'index passé est correcte. Mais il y a aussi vecteur :: méthode à() qui lance out_of_range exception si l'indice est passé invalide afin que vous puissiez le tester comme ceci:

TEST_METHOD(VectorOutOfRangeAccess_Test) 
{ 
    auto out_of_range_thrown{false}; 
    try 
    { 
     ::std::vector<int> const values{0, 1, 2}; 
     values.at(3); 
    } 
    catch(::std::out_of_range const &) 
    { 
     out_of_range_thrown = true; 
    } 
    catch(...){} 
    Assert::IsTrue(out_of_range_thrown); 
}