2012-09-27 22 views
5

Estoy tratando de hacer una prueba unitaria en algún código de C++, pero me estoy metiendo en problemas.¿Por qué Assert :: AreEqual en el marco de VS UnitTesting no funciona con std :: string?

tengo algo similar a las siguientes líneas de código ...

std::string s1 = obj->getName(); 
std::string s2 = "ExpectedName"; 
Assert::AreEqual(s1, s2, "Unexpected Object Name"); 

Y estoy recibiendo el siguiente error del compilador ...

error C2665: 'Microsoft::VisualStudio::TestTools::UnitTesting::Assert::AreEqual' : 
none of the 15 overloads could convert all the argument types 

parece que debe ser una coincidir con the following overload:

AreEqual<(Of <(T>)>)(T, T, String) 

no es la sobrecarga por encima de una sobrecarga de la plantilla que debería soportar cualquier objeto, siempre y cuando los argumentos 1 y 2 sean del mismo tipo? ¿O me estoy perdiendo algo?

¿Hay alguna otra forma en que pueda lograr este Assert?

Respuesta

1

Pirateé un poco de una solución de manera que los números enteros son comparados en lugar de cuerdas:

Assert::AreEqual(0, s1.compare(s2), "Unexpected Object Name"); 

En el futuro, es probable que cambiemos a pruebas nativas de unidad C++, pero mientras tanto, esto funciona. Obviamente, el mensaje para esto no es muy útil

Assert.AreEqual failed. Expected:<0>. Actual:<1>. Unexpected Trajectory Name 

Pero es mejor que nada.

+2

Otra solución (para cadenas solo sin esfuerzo adicional) sería usar la [biblioteca incorporada de referencias] (http://msdn.microsoft.com/en-us/library/bb384865 (VS.100) .aspx): 'Assert :: AreEqual (marshal_as (s1), marshal_as (s2), L" Nombre de objeto inesperado ");'. +1 sin embargo, creo que su solución alternativa es creativa. : -] – ildjarn

4

usted está tratando de utilizar el marco de pruebas administrado unidad con tipos nativos - esto simplemente no va a funcionar sin cálculo de referencias de los objetos en tipos administrados en primer lugar.

VS2012 ahora viene con native C++ unit testing framework; utilizando este marco en su lugar, el código podría funcionar cambiando "Unexpected Object Name" a una cadena de ancho (prefijo con L) y llamando the following overload:

template<typename T> 
static void AreEqual(
    const T& expected, 
    const T& actual, 
    const wchar_t* message = NULL, 
    const __LineInfo* pLineInfo = NULL) 
+0

Agradezco la explicación de por qué no funciona, pero no tengo acceso a VS2012. – sgryzko

+0

@sgryzko: Entonces su mejor opción es utilizar un marco de prueba de C++ nativo de terceros; usar un marco administrado para probar tipos nativos es un 2000% más de esfuerzo de lo que vale. [Boost.Test] (http://www.boost.org/libs/test/) podría ser un buen comienzo. – ildjarn

+0

¿Puedo sugerir [xUnit ++] (https://bitbucket.org/moswald/xunit) en lugar de Boost.Test?Es (en mi opinión ciertamente parcial) un poco más simple para empezar. – moswald

3

Si estamos tratando de permanecer en un-manejado C++, y no nos importa lo que el mensaje de error parece, esto es probablemente una mejor opción que la respuesta aceptada:

Assert::IsTrue(s1==s2)

Por Mejor, quiero decir que es al menos fácil de leer.

0

creo que la solución es que nos L prefijo antes de cadena

 Assert::AreEqual<bool>(true, dict->IsBeginWith("", ""), L"Empty"); 

También puede intentar caso como éste, que le dan resultados erróneos, pero llevar a la dirección correcta de la comprensión del tema

Assert::AreEqual<bool>(true, dict->IsBeginWith("", ""), (wchar_t*)"Empty"); //Empty 
    Assert::AreEqual(true, dict->IsBeginWith("A", "A"), (wchar_t*)"Empty2"); 
    Assert::AreEqual(true, dict->IsBeginWith("A", "a"), (wchar_t*)""); //CAPITAL LETTER Check 
Cuestiones relacionadas