Estoy empezando a experimentar con el testing unitario, trabajo con Cpputest para un proyecto de C embebido en un ST. Quizás tenga dudas de principiante, pero las tengo y quisiera poder aclararlas si alguien identifica rápidamente una respuesta o consejo.
Digamos que tengo montado un test para una función RFID_DRV_GetStatus() que va a devolver una struct. Una struct de tipo RFIDDrvStatus. Pero los campos de esta struct serán actualizados una vez recibe otra estructura (de la que va a tomar algunos campos) procedente de una llamada de sistema -a la que voy a mockear y fingir un retorno (aún no está implementado ese paso pero lo haré). En este punto no importa el tipo de dato para la pregunta que voy a formular. Sólo tened en cuenta que no va a ser del mismo tipo declarado que status_val. Eso seguro.
TEST(RFID_Drv,RFID_DRV_GetStatus_test )
{
RFIDDrvStatus status_val = {0};
RFIDDrvStatus status_val_check;
/*struct nueva con valores para hacer yo luego unas comparaciones*/
status_val_check.AUTOCALIB_FLAG=TRUE;
status_val_check.WAKE_FLAG=TRUE;
status_val_check.DATA_READ_FLAG=TRUE;
status_val_check.ID_READ_FLAG=FALSE;
status_val_check.STOP_FRAME_FLAG=FALSE;
status_val_check.DATA_ERROR = NONE;
uint32_t TEST_DATA_ROW_VALUE=15;
mock().enable();
mock().expectOneCall("HAL_AS393x_GetStatus"); //esta llamada le devolverá unos datos (en forma de estructura y diferente a la del retorno de la función a testear: se aprecia en código de la función a testear)
mock().expectOneCall("HAL_AS393x_GetData").andReturnValue(TEST_DATA_ROW_VALUE);
status_val = RFID_DRV_GetStatus(); //se puede???
CHECK_EQUAL(status_val,status_val_check);//revisar nomenclatura al comparar structs
mock().disable();
}
Mi pregunta es, de las dos líneas que están en negrita, teniendo en cuenta que los mocks anteriores, que devuelven valores para que RFID_DRV_GetStatus() se monte la estructura que comento y la devuelve como valor de retorno a status_val; es correcto? puede hacerse sin que presente conflictos?
Nota: la estructura status_val no tiene por qué ser del mismo tipo que el mock le pasará. La llamada mockeada le pasará unos datos de otro tipo y dentro de la función a testear ya se encargá su lógica de construir status_val.
Por si os ayuda tener el código de la función de la que hacemos test de grupo ahí la dejo (aunque sólo inicializa una estructura):
//y la definición de structs
typedef enum
{
NONE = 0x00,
BITS_READ_ERROR = 0X01,
MANCHESTER_ERROR = 0X02,
START_BIT_ERROR = 0X03,
STOP_BIT_ERROR = 0X04,
NEGATED_DATA_ERROR = 0X05,
CRC_ERROR = 0X06
}RFID_DataError;
typedef struct
{
bool_t AUTOCALIB_FLAG;
bool_t WAKE_FLAG;
bool_t DATA_READ_FLAG;
bool_t ID_READ_FLAG;
bool_t STOP_FRAME_FLAG;
RFID_DataError DATA_ERROR;
}RFIDDrvStatus;
typedef struct
{
bool_t WAKE_FLAG;
bool_t DATA_READ_FLAG;
}HAL_AS393X_Status;
RFIDDrvStatus RFID_DRV_GetStatus(void)
{
HAL_AS393X_Status HAL_Status;
/* Gets HAL_AS393X Status */
HAL_Status=HAL_AS393x_GetStatus();
/* Updates RFID Driver Status */
RFIDStatus.AUTOCALIB_FLAG=RFIDStatus.AUTOCALIB_FLAG;
RFIDStatus.WAKE_FLAG=HAL_Status.WAKE_FLAG;
RFIDStatus.DATA_READ_FLAG=HAL_Status.DATA_READ_FLAG;
RFIDStatus.ID_READ_FLAG=RFIDStatus.ID_READ_FLAG;
RFIDStatus.STOP_FRAME_FLAG=RFIDStatus.STOP_FRAME_FLAG;
RFIDStatus.DATA_ERROR=RFIDStatus.DATA_ERROR;
Espero haberme hecho entender y agradezco la atención de antemano.
Un cordial saludo, chicos.