2012-09-27 7 views
5

Sto provando a fare un test unitario su qualche codice C++ ma sto incontrando dei problemi.Perché non asserire :: AreEqual nel framework VS UnitTesting funziona con std :: string?

ho qualcosa simile alle seguenti righe di codice ...

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

e sto ottenendo il seguente errore del compilatore ...

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

sembra che dovrebbe essere un match con the following overload:

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

non è il sovraccarico di sopra di un sovraccarico del modello che dovrebbe supportare qualsiasi oggetto, purché gli argomenti 1 e 2 siano dello stesso tipo? O mi sta sfuggendo qualcosa?

C'è qualche altro modo in cui posso realizzare questo Assert?

risposta

1

ho inciso un po 'di una soluzione in modo che gli interi sono confrontati invece di stringhe:

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

In futuro, probabilmente passeremo a test di unità C++ nativi, ma nel frattempo, questo è il trucco. Ovviamente la messaggistica per questo non è molto utile

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

Ma è meglio di niente.

+2

Un'altra soluzione (per le stringhe solo senza sforzi aggiuntivi) consiste nell'utilizzare la [libreria di marshalling integrata] (http://msdn.microsoft.com/en-us/library/bb384865 (VS.100) .aspx): 'Assert :: AreEqual (marshal_as (s1), marshal_as (s2), L" Nome oggetto imprevisto ");'. +1 però, penso che la tua soluzione sia creativa. : -] – ildjarn

4

si sta tentando di utilizzare il framework di test gestito unità con tipi nativi - questo semplicemente non è andare a lavorare senza il marshalling gli oggetti in tipi gestito prima.

VS2012 ora viene fornito con native C++ unit testing framework; utilizzo di questo quadro, invece, il codice potrebbe funzionare modificando "Unexpected Object Name" ad una vasta stringa (il prefisso con L) e chiamando 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

Apprezzo la spiegazione del motivo per cui non funziona, ma non ho accesso a VS2012. – sgryzko

+0

@sgryzko: Quindi la soluzione migliore è utilizzare un framework di test C++ nativo di terze parti: utilizzare un framework gestito per testare i tipi nativi è il 2000% in più di sforzo rispetto a quello che vale. [Boost.Test] (http://www.boost.org/libs/test/) potrebbe essere un buon inizio. – ildjarn

+0

Potrebbe suggerire [xUnit ++] (https://bitbucket.org/moswald/xunit) invece di Boost.Test?E '(secondo il mio parere esplicitamente parziale) un po' più semplice per iniziare. – moswald

3

Se stiamo cercando di stare in un gestiti C++, e non ci importa quello che il messaggio di errore sembra, questa è probabilmente una scelta migliore rispetto alla risposta accettata:

Assert::IsTrue(s1==s2)

By meglio, voglio dire che è almeno facile da leggere.

0

Credo soluzione è quella di noi L prefisso prima stringa

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

Si può anche provare a caso come questo, che vi darà risultati errati, ma portare a giusta direzione della comprensione della questione

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 
Problemi correlati