Domanda

Eventuali istruzioni ASSERT non riuscite su Windows fanno apparire il seguente messaggio di debug e bloccano l'esecuzione delle applicazioni. Mi rendo conto che si tratta di un comportamento previsto, ma è in esecuzione periodicamente su una macchina senza testa, quindi evita che i test unitari falliscano, invece attendi l'input dell'utente a tempo indeterminato.

Esiste una chiave di registro o un flag del compilatore che posso usare per impedire a questa finestra di messaggio di richiedere l'input dell'utente pur consentendo il fallimento del test in ASSERT?

Fondamentalmente, voglio farlo senza modificare alcun codice, cambiando solo il compilatore o le opzioni di Windows.

Grazie!

Libreria di debug di Microsoft Visual C ++ ASSERT http : //img519.imageshack.us/img519/853/snapshotbu1.png

È stato utile?

Soluzione

Da MSDN sulla macro ASSERT:

In un'applicazione ISAPI MFC, un'asserzione in modalità debug farà apparire una finestra di dialogo modale (le finestre di dialogo ASSERT sono ora modali per impostazione predefinita); questo interromperà o bloccherà l'esecuzione. Per sopprimere le finestre di dialogo dell'asserzione modale, aggiungere le seguenti righe al file sorgente del progetto (projectname.cpp):

// For custom assert and trace handling with WebDbg
#ifdef _DEBUG
CDebugReportHook g_ReportHook;
#endif

Al termine, è possibile utilizzare lo strumento WebDbg (WebDbg.exe) per visualizzare le asserzioni.

Altri suggerimenti

Penso che questa sia una finestra di dialogo mostrata da _CrtDbgReport per report di tipo _CRT_ASSERT. Con _CrtSetReportHook, puoi personalizzare questo comportamento per l'intera applicazione. (ovvero richiede una modifica locale) In particolare, puoi continuare l'esecuzione dopo un'asserzione non riuscita, ignorandola in tal modo.

In un contesto di unit test, è spesso utile convertire ASSERT (in realtà chiamate _CrtDbgReport ) in alcune eccezioni, in genere un'eccezione std ::, che contiene del testo informativo. Questo tende ad uscire dal log di output del test unitario come un fallimento. È proprio quello che vuoi: un ASSERT fallito dovrebbe essere un test unitario fallito.

Fallo attivando la funzione hook di report, come specificato utilizzando: _CrtSetReportHook()

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top