Skonfigurowałem projekt w Visual Studio 2010, aby pisać testy jednostkowe przeciwko istniejącej biblioteki DLL MFC. Używam struktury testowej jednostkowej stacji i powiązanej z biblioteką DLL MFC z projektu testu jednostkowego. Próbuję skonstruować klasę, która ma std::wstring
w jego konstruktora. Oto co mój test wygląda następująco:Nie można przekazać std :: wstring całej biblioteki DLL
TEST_CASE("MyProject/MyTest", "Do the test.")
{
MockDbService mockDbService;
Foobar foo(L"{F00DFACE-FEED-DEAD-BEEF-C0FFEEDECADE}", mockDbService);
foo.loadObject();
REQUIRE(mockDbService.getMethodInvokeCount("query()") >= 1);
}
Gdzie Foobar
jest klasa wywiezione z MFC DLL badanego. Jednak struktura testowa zgłasza nieoczekiwany wyjątek. Śledziłem to do konstruktora kopiowania std::wstring
podczas kopiowania łańcucha do konstruktora Foobar
. Debugger MSVC zgłasza łańcuch źródłowy jako <Bad Ptr>
.
Stworzyłem fikcyjnego konstruktora, Foobar::Foobar(long num, IDbService& db)
i wszystkie wartości (w tym IDbService&
) są dobrze widoczne.
Zarówno biblioteka DLL MFC, jak i mój plik EXE testu jednostki udostępniają arkusz właściwości, który powinien zapewniać równoważność flag kompilatora. Buduję i przeprowadzam test w trybie debugowania. Wszelkie pomysły, dlaczego std::wstring
nie można skopiować w DLL?
Czy dynamicznie łączysz plik EXE i bibliotekę DLL z wersją debugowania CRT? ('/ MDd') –
@ Mr.C64 Wow, to było to. Mój projekt testów jednostkowych używał '/ MD', a DLL MFC to'/MDd'. Chciałbym otrzymać krótkie wyjaśnienie jako odpowiedź, więc mogę to zrozumieć; i zaakceptuję to. Dzięki! –
Dodałem krótkie wyjaśnienie. Zasadniczo uważam, że problem w twoim przypadku polega na tym, że 'std :: wstring' debug-build ma inną implementację niż' std :: wstring' release-build. –