2012-09-27 7 views
5

Próbuję wykonać test jednostki na niektóre kodu C++, ale mam pewne problemy.Dlaczego Assert :: AreEqual w ramach VS UnitTesting nie działa ze std :: string?

Mam coś podobnego do następujących linii kodu ...

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

A ja otrzymuję następujący błąd kompilatora ...

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

Wydaje się, że powinna być zgadza się z the following overload:

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

nie Czy powyższe przeciążenie przeciążenie szablon która powinna obsługiwać dowolny obiekt, o ile argumenty 1 i 2 są tego samego typu? Czy może czegoś brakuje?

Czy jest jakiś inny sposób, w jaki mogę to osiągnąć?

Odpowiedz

1

I włamał się trochę obejście, tak że liczby całkowite są porównywane zamiast strun:

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

W przyszłości prawdopodobnie przejdziemy na natywne testowanie jednostek C++, ale w międzyczasie robi to. Oczywiście komunikator nie jest zbyt pomocny.

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

Ale to lepsze niż nic.

+2

Innym obejściem (tylko dla ciągów bez dodatkowego wysiłku) byłoby użycie [wbudowanej biblioteki gromadzącej dane] (http://msdn.microsoft.com/en-us/library/bb384865 (VS.100) .aspx): 'Assert :: AreEqual (marshal_as (s1), marshal_as (s2), L" Nazwa nieoczekiwanego obiektu ");'. +1, myślę, że twoje obejście jest kreatywne. : -] – ildjarn

4

Próbujesz użyć testowania ramy udało jednostka z rodzimych typów - to po prostu nie będzie działać bez Organizowanie obiektów w zarządzanych typów pierwszy.

VS2012 jest teraz dostarczany z native C++ unit testing framework; Korzystając z tej ramy zamiast, Twój kod może działać poprzez zmianę "Unexpected Object Name" do szerokiej string (prefiks z L) i wywołanie 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

Doceniam wyjaśnienie, dlaczego to nie działa, ale nie mam dostępu do VS2012. – sgryzko

+0

@sgryzko: W takim razie najlepiej jest użyć natywnej architektury testowej C++ innej firmy - używanie testowanego frameworka do testowania rodzimych typów to 2000% więcej wysiłku, niż jest to warte. [Boost.Test] (http://www.boost.org/libs/test/) może być dobrym początkiem. – ildjarn

+0

Czy mogę zaproponować [xUnit ++] (https://bitbucket.org/moswald/xunit) zamiast Boost.Test?Jest to (moim zdaniem jest stronnicze) nieco łatwiejsze do rozpoczęcia. – moswald

3

Jeśli staramy się pozostać w un-managed C++, i nie obchodzi mnie, co wygląda komunikat o błędzie podobny, to jest chyba lepszym rozwiązaniem niż zaakceptowanej odpowiedzi:

Assert::IsTrue(s1==s2)

By lepiej, mam na myśli, że to jest przynajmniej łatwe do odczytania.

0

wierzę rozwiązanie jest dla nas L prefiks przed ciągiem

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

można także spróbować przypadku jak ten, który daje błędne wyniki, ale prowadzą do prawego kierunku zrozumienia kwestii

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 
Powiązane problemy