2013-07-17 8 views
10

Po prostu zacząłem eksperymentować z moq, aby przetestować jednostki moje moduły.Uzyskiwanie pożądanej/poprawnej ścieżki złożenia podczas testowania urządzenia za pomocą NUnit

Faktycznie, klasa, dla których muszę napisać test jednostkowy wykorzystuje

Assembly.GetExecutingAssembly().Location wewnętrznie, aby określić ścieżkę.

Ale to nie działa podczas pisania testów jednostkowych, ponieważ ścieżka zespołu wykonującego jest inna (ścieżka zespołu badawczego jednostka zostanie podjęta)

AppData\\Local\\Temp\\3ylnx32t.ukg\\TestApplication.Test\\assembly\\dl3\\aeb938e6\\f3664631_d982ce01.

Próbowałem, wyłączając kopiowanie w tle.

AppDomainSetup appDomain= new AppDomainSetup{ShadowCopyFiles = "false",}; 
appDomain.ShadowCopyFiles=false.ToString(); 

nadal nie działa!

Wszelkie sugestie są mile widziane. Z góry dziękuję.

+0

że pewne problemy ze ścieżkami montażowych podczas testowania jednostkowej, jak również. Prawdopodobnie pomaga, spójrz na http://stackoverflow.com/questions/17313831/get-path-of-referenced-project-turing-unit-testing –

+1

@OP Wątpię, że jest to problem z moq. Jakie ramy testowania wykorzystujesz?NUnit, na przykład uruchamia testy w osobnym AppDomain z włączoną opcją ShadowCopy. –

Odpowiedz

1

W końcu dokonał tego poprzez ten sposób:

użyłem Framework NUnit i niepełnosprawnych kopiowanie cień w NUnit. Utworzono kopię mojego pliku konfiguracyjnego w tym katalogu, w którym wywołana jest biblioteka testów jednostkowych.

Tak więc za każdym razem, gdy wywoływany jest mój test jednostkowy (powiedzmy ze ścieżki "A"), moja aplikacja nie narzeka, że ​​nie ma pliku konfiguracyjnego w tej lokalizacji, ponieważ umieszczam plik konfiguracyjny w ścieżce "A".

(ps: Powodem, dla którego mam miejsce montażu ma być w stanie znaleźć mój plik konfiguracyjny w tej lokalizacji)

[Cała idea jest taka: z kopiowaniem cień, ścieżka montaż jest dynamiczna. wyłącz go i ścieżka montaż jest statyczny]

+0

Jak wyłączyć ShadowCopy? Próbowałem różnych rodzajów kodu i nic nie jest w stanie go wyłączyć. Czy możesz dać nam próbkę? – Erick

+0

W rzeczywistości wyłączono kopiowanie w tle w NUnit. Idź do Tools-> Settings i odznacz pole wyboru "Enable Shadow Copy". To powinno wystarczyć. –

+0

Ah. Myślałem, że usunąłeś go z aplikacji. Próbowałem usunąć go z mojej aplikacji na komputer i nic nie działa. – Erick

4

Być może nie jest to dokładna odpowiedź na twoje pytanie, ale osobiście, nawet nie próbowałbym uzyskać rzeczywistej wartości Assembly.GetExecutingAssembly().Location podczas testu jednostkowego. Chciałbym stworzyć coś takiego:

public interface IAssemblyHelper 
{ 
    string GetLocationOfExecutingAssembly(); 
} 

public class AssemblyHelper : IAssemblyHelper 
{ 
    public string GetLocationOfExecutingAssembly() 
    { 
     return Assembly.GetExecutingAssembly().Location; 
    } 
} 

W czasie wykonywania chciałbym wstrzyknąć AssemblyHelper do konstruktora klasy, które wymagało, jak IAssemblyHelper. W testach jednostkowych kpiłbym z IAssemblyHelper, ustawiłem go tak, aby zwracał oczekiwaną ścieżkę i przekazywał próbę do konstruktora klasy.

Testowanie, czy kod działa z rzeczywistą ścieżką lokalizacji zespołu wykonawczego w aplikacji, powinno być częścią testu akceptacyjnego.

+0

Punkt używający względnej ścieżki jest taki, że gdy inni, którzy sprawdzą twój kod na inną ścieżkę, niż się spodziewasz, to nadal będzie działać. "ustaw go, aby zwrócić oczekiwaną ścieżkę"/zakodowaną ścieżkę -1 – TamusJRoyce

+0

@TamusJRoyce Źle zrozumiałeś. Nie ma to nic wspólnego ze ścieżkami względnymi ani z wykryciem kodu. Opowiadam się za konfiguracją ** sztuczki ** z 'IAssemblyHelper', aby zwrócić znaną strunę dla ścieżki, którą można potwierdzić w testach jednostkowych. W kodzie wykonawczym wywołanie przechodzi do konkretnej klasy 'AssemblyHelper' i zwraca rzeczywistą lokalizację zespołu wykonawczego. –

1

Kolega zaproponował następujące rozwiązanie, które działa na wszystkich przypadków użycia:

public static string AssemblyDirectory 
{ 
    get 
    { 
     string codeBase = Assembly.GetExecutingAssembly().CodeBase; 
     var uri = new UriBuilder(codeBase); 
     string path = Uri.UnescapeDataString(uri.Path); 
     return Path.GetDirectoryName(path); 
    } 
} 
Powiązane problemy