2012-03-28 13 views
5

Tengo una aplicación antigua heredada de C++ que estoy intentando escribir algunas pruebas de unidad. Creé un segundo proyecto en mi solución que se basa en un ejecutable de prueba de unidad (usando googletest). El proyecto de prueba hace referencia a los archivos de encabezado del proyecto principal. El proyecto de prueba funciona bien hasta que intento utilizar una de las clases del proyecto principal.Hace referencia a las clases de un proyecto .EXE de VC++ de un proyecto .EXE de pruebas de unidad

#include "stdafx.h" 

#include "JsContext.h" 
#include "gtest/gtest.h" 

TEST(JsContextTests, CreateJsContext) { 
    JsContext context; // linking fails as soon as this line is added 
} 

Produce ..

Error 1 error LNK2001: unresolved external symbol "public: __thiscall JsContext::JsContext(void)" ([email protected]@[email protected]) JsContextTests.obj tests 
Error 2 fatal error LNK1120: 1 unresolved externals D:\Projects\Js-Clean\src\Debug\tests.exe tests 

El ejecutable principal no produce un archivo .lib así que estoy seguro de lo que debería estar que une el proyecto de prueba en contra.

¿Cuál es el mejor enfoque para las clases de pruebas unitarias de otro proyecto EXE?

Respuesta

6

Si su proyecto principal no produce una biblioteca, debe vincular el archivo .obj generado a partir del JsContext.cpp, o el archivo que tenga la fuente JsContext.h. Sin embargo, debería ser trivial cambiar su proyecto principal para construir en una biblioteca estática, en lugar de ejecutable. Puede hacerlo en Propiedades del proyecto, en Configuración -> General -> Tipo de configuración.

Si la creación de una biblioteca estática no es posible, creo que su mejor opción sería simplemente recompilar los archivos fuente en su proyecto de prueba; podría agregar un filtro 'Dependencias principales del proyecto' y solo incluir los archivos fuente necesarios para lo que está probando.

Si esto no es posible, como último recurso, puede utilizar un evento de enlace previo para copiar los archivos relevantes .obj del directorio de salida del proyecto principal al directorio de salida de su proyecto de prueba, pero no sugeriría esta.

Cuestiones relacionadas