2016-05-24 8 views
0

Ich muss Einheit eine geschützte Methode testen, da es einige Kernlogik hat (ich kann diesen Teil nicht ändern, da er nicht in meiner Kontrolle ist). Es ändert keine Mitglieder und kann daher keine darauf basierenden Behauptungen schreiben. Es gibt nichts zurück, außer das Lesen aus einer Registrierung und das Schreiben in eine Protokolldatei. Wie kann ich einen Komponententest mit Moq und Visual Studio NUnit Test für dieses Szenario schreiben:Einheit, die eine void-Methode testet, die in eine Datei schreibt und keine Klassenmitglieder mutiert

protected override void OnPluginStarting() 
{ 
    try 
    { 
     using (var key = registryAccessor.LocalMachine.OpenSubKey(ProdInstallRegKey)) 
     { 
      foreach (string subkeyName in key.GetSubKeyNames()) 
      { 
       using (var subkey = key.OpenSubKey(subkeyName)) 
       { 
        string displayName = subkey.GetValue("DisplayName") == null ? string.Empty : subkey.GetValue("DisplayName").ToString(); 
        if (!string.IsNullOrEmpty(displayName) && installedProducts.ContainsKey(displayName)) 
        { 
         Log.Info(installedProducts[displayName] + " version is " + subkey.GetValue("DisplayVersion")); 
        } 
       } 
      } 
     } 
    } 
    catch (Exception ex) 
    { 
     Log.Error("An error occured while getting the version numbers of DDP components. "+ex.Message); 
    } 
} 

RegistryAccessor ein Wrapper für die Registry ist und ich habe es so, dass ich es aus meinen Unit-Tests spotten kann. Aber wie kann ich das Pseudo-Registrierungsobjekt an die Methode übergeben, wenn es keine Parameter verwendet? Die einzigen Dinge, die ich herausgefunden habe, ist, dass ich PrivateObject verwenden kann, um private und protected Instanzen zu erstellen. Könnte jemand bitte helfen?

+0

registryAccessor wie ein Membervariable sieht, wo es definiert/aktuelles/initialisiert? – forsvarir

Antwort

0

Sie können nicht.

Es gibt kommerzielle Tools wie TypeMock, die die Profiler-API verwenden, um solche Dinge zu erreichen. Dies ermöglicht versiegelte Klassen abzufangen, statische Methoden usw.

1

Sie someway der Injektion registryAccessor und logger haben sollte, auf diese Weise können Sie den Code steuern, was aus der Registrierung liest und die Ausgabe bestätigen durch den Aufruf der logger überprüfen.

Ansonsten können Sie einige Integrationstests versuchen (wahrscheinlich schwieriger in Ihrem Fall) oder so etwas wie TypeMock

Verwandte Themen