devstyle.pl - Blog dla każdego programisty
devstyle.pl - Blog dla każdego programisty
2 minut

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


28.01.2010

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

Nie przegap kolejnych postów!

Dołącz do ponad 9000 programistów w devstyle newsletter!

Tym samym wyrażasz zgodę na otrzymanie informacji marketingowych z devstyle.pl (doh...). Powered by ConvertKit

Comments are closed.

Moja książka

Facebook

Zobacz również