Niekiedy test jednostkowy sprawdza poprawność jakiegoś skomplikowanego algorytmu bądź parsera tekstu bądź czegokolwiek, co wymaga znacznych ilości danych. Zamiast umieszczać te dane w kodzie, niejednokrotnie wygodniej jest po prostu wrzucić je do pliku, plik dodać do projektu i ustawić jego właściwość “Copy to Output Directory” na Always. W normalnej sytuacji pobralibyśmy dane o tak:
1: string filePath = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), @"TestData\" + fileName);
I w niektórych scenariuszach testowych takie coś zadziała. Problem jednak pojawi się na przykład w przypadku Resharpera gdy zaznaczona będzie poniższa opcja:
Uzyskamy podobny temu komunikat: “System.IO.DirectoryNotFoundException: Could not find a part of the path ‘C:\Documents and Settings\User\Local Settings\Application Data\assembly\dl3\Y1J1R0E5.5EQ\ZPW5QAC9.MPO\836998ac\10edf95d_6f94ca01\TestData\data.txt“. W tej sytuacji właściwość Location nie zwróci tego co oczekujemy.
Więcej w tym temacie na MSDN w artykule “Shadow Copying Assemblies“.
Ale jak temu zaradzić? Wyłączenie tej opcji nie może być jedynym wyjściem.
I nie jest. Lokalizację źródłowego assembly na dysku uzyskamy za pomocą takiej metody:
1: public static string GetAbsoluteTestLocation() 2: { 3: string codeBaseLocation = Path.GetDirectoryName(Assembly.GetExecutingAssembly().CodeBase); 4: return new Uri(codeBaseLocation).AbsolutePath; 5: }
I testy znowu działają…
1: string filePath = Path.Combine(PathUtil.GetAbsoluteTestLocation(), @"TestData\" + fileName);