11

Mam projekt testowy jednostki Visual Studio do testowania projektu ASP.NET MVC.MSTest - Jak zainicjować log4net dla projektu UnitTest?

Dodanie montażowej poziomie log4net.Config.XmlConfigurator atrybutem AssemblyInfo.cs nie działa, a inni na SO odkryli oni muszą korzystać z bezpośredniego połączenia do log4net.Config.XmlConfigurator.Configure();

Chodzi o to, w jaki sposób można to zrobić dla test jednostkowy? Odpowiedź na użycie atrybutu Microsoft.VisualStudio.TestTools.UnitTesting.AssemblyInitialize dla metody klasy nie działa.

Dla mnie ten kod powoduje, że InvalidOperationException zalogował się w oknie wyjściowym, a bomby testowe wcześnie.

[TestClass] 
public sealed class Startup 
{ 
    [AssemblyInitialize] 
    public void Configure() 
    { 
     System.Diagnostics.Debug.Write("Microsoft.VisualStudio.TestTools.UnitTesting.AssemblyInitialize"); 
    } 
} 

Czytanie dokumentacji MSDN mówi, aby nie używać AssemblyInitialize projektów badawczych dla ASP.NET, ponieważ mogą one być nazywane więcej niż jeden raz.

Jak to zrobić, aby log4net był skonfigurowany przed uruchomieniem jakichkolwiek testów?

+2

Czy mogę zaproponować inne podejście, używając abstrakcji do log4net, coś w rodzaju ILogger, który definiuje debugowanie, info, warn, itp. W ten sposób możesz dostarczyć różne implementacje dla ILogger, jeden używający log4net do rzeczywistego logowania i do użycia w twojej aktualnej aplikacji, a drugą coś takiego jak InMemoryLogger, który może być bardzo przydatny do użycia w UnitTesting. Możesz wtedy nawet symulować (używając moq) program ILogger, co nie jest możliwe przy bezpośrednim użyciu log4net. –

+0

Twoje podejście jest lepsze. Chociaż loguję się abstrakcyjnie, nie robię DI z logowaniem, ponieważ nigdy nie potrzebowałem przełączać komponentu logowania - i tak są one konfigurowalne - więc jeśli nadejdzie dzień, gdy log4net będzie musiał odejść, właśnie przekoduję moja fabryka ILogger. W tym przypadku po prostu chciałem zobaczyć moje wyciągi logujące w debugerze. –

Odpowiedz

22

Odpowiedź brzmiała, że ​​źle wykorzystałem numer AssemblyInitialize.

Po ustawieniu debuggera na zatrzymanie przy wyjątkach pierwszej szansy, mogłem przeczytać, że moja metoda nie była statyczna i nie dodałem do niej parametru akceptującego wartość TestContext.

Bardzo nieudolne użycie atrybutu, jeśli metoda musi być w pewien sposób, o ile mnie poprosisz. Niezbyt wykrywalny.

Zresztą to działa:

[TestClass] 
public static class Startup 
{ 
    [AssemblyInitialize] 
    public static void Configure(TestContext tc) 
    { 
     log4net.Config.XmlConfigurator.Configure(); 
    } 
} 

Jeśli chodzi o porady, aby nie używać tego testu dla ASP.NET, darń go. Może się uruchomić więcej niż jeden raz, ale to nie ma znaczenia.