. jak .NET

Blog by Maciej "Procent" Aniserowicz

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);

Komentarze

dotnetomaniak.pl

28 stycznia 2010 02:24

Trackback from dotnetomaniak.pl

Maciej Aniserowicz | Testy jednostkowe z R# a pliki zewnętrzne, czyli problem z shadow copying

Dodaj komentarz


 

[b][/b] - [i][/i] - [u][/u] - [quote][/quote] - [code][/code]