2012-01-27 15 views
16

Korzystanie z Microsoft Test Framework i Moq Próbuję sprawdzić, czy została wywołana metoda log4net.Konfigurowanie moq i sprawdzanie, czy metoda została wywołana

[TestMethod()] 
    public void Log_Info_When_Stuff_Is_Done() 
    { 
     SampleClass sampleObject = new SampleClass(); 

     Mock<log4net.ILog> logMockObject = new Mock<log4net.ILog>(); 

     sampleObject.Log = logMockObject.Object; 

     sampleObject.DoStuffAndLogInfo(); 

     logMockObject.Verify(moqLog => moqLog.Info("do stuff got called"), Times.AtLeastOnce()); 

    } 

uzyskać wyjątek na Sprawdzić połączenia mówiąc, że

Oczekiwany wezwanie na mock co najmniej raz, ale nigdy nie było wykonywane: moqLog => moqLog.Info („robić rzeczy został nazwany”) Nie skonfigurowano żadnych konfiguracji. Nie wykonano wywołań.

Co robię źle?

aktualizacja problem dotyczył pobierającego dla właściwości SampleClas.Log. Zawsze zwracałem LogManager.GetLogger(...);, nawet jeśli właściwość była już ustawiona na ILogProxy. Miałem wrażenie, że narzędzie do uzyskania dostępu nie zostanie wywołane, ponieważ skonfigurowałem serwer proxy tak, jak sampleObject.Log = logMockObject.Object;

+0

Czy „do rzeczy, ale o nazwie” dokładny ciąg były przekazywane do .info? –

+1

Co robi funkcja 'sampleObject.DoStuffAndLogInfo()? –

+0

Nie. Czy parametr ma znaczenie? Myślałem, że parametry nie mają znaczenia, o ile coś przekazujesz. –

Odpowiedz

1

Test został poprawnie skonfigurowany.

Sprawdź swój sut, aby sprawdzić, czy Log.Info jest wywoływany wewnątrz metody DoStuffAndLogInfo.

+0

Zgadzam się z tą odpowiedzią. Aby dać sobie spokój, uruchom ten sam test z moją SampleClass, a zobaczysz, że twój test się powiódł. 'public class SampleClass {public void Log (log ILog) {log.Warn (" do rzeczy został wywołany "); }} ' –

+0

@JohnRuiz poprawne, ja również użyłem takiej klasy - tylko" Info "zamiast" Ostrzegaj " – GolfWolf

+0

To ma sens. Wprowadziłem tę zmianę, ale musiałem wprowadzić kolejną zmianę. Zobacz moją aktualizację na pytanie. –

32

W tej chwili Moq sprawdza, czy DoStuffAndLogInfo dzwoni pod Info z dokładnym ciągiem "czy coś zostało wywołane". Jeśli to faktycznie dzwoni Info z innym argumentem, i nie obchodzi mnie, co rzeczywisty argument jest użycie następujących zamiast:

logMockObject.Verify(moqLog => moqLog.Info(It.IsAny<string>()), Times.AtLeastOnce()); 
+0

To ma sens. Wprowadziłem tę zmianę, ale musiałem wprowadzić kolejną zmianę. Zobacz moją aktualizację na pytanie. –

+0

Utworzono próbę dla dziennika, ale nie dla "SampleClass". Jeśli 'SampleClass.DoStuffAndLogInfo' uzyska dostęp do' this.Log', to nadal będzie wywoływał twój akcesor 'get' dla' SampleClass.Log'. –

Powiązane problemy