2016-07-20 10 views
1

Ich möchte Mock Windows-Registrierung, die ich in meinem Unit-Test verwenden müssen Verwenden von C#. Ich habe geschrieben, um die Registrierung für HKLM und HKCU.Wow zu schreiben, schreibe ich Unit-Tests für die folgende Funktion. Ich will nicht systemWrapper verwenden Bitte könnte jemand helfen, auf dieserUnit Testing für Windows-Registry-Operationen

public static bool createHkcuRegistry(string registryPath, string valueName, string value, RegistryValueKind valueKind = RegistryValueKind.String) 
    { 
     try 
     { 
      RegistryKey key = Registry.CurrentUser.OpenSubKey(registryPath, true); 
      if (key != null) 
      { 
       key.SetValue(valueName, value, valueKind); 
       key.Close(); 

      } 
      else 
      { 
       RegistryKey newKey = Registry.CurrentUser.CreateSubKey(registryPath); 
       newKey.SetValue(valueName, value, valueKind); 
      } 
      return true; 
     }   
     } 
+1

Warum willst du nicht mit 'systemWrapper'? –

+0

Da Sie SystemWrapper nicht verwenden möchten, können Sie die Abstraktion selbst neu erstellen, da der beste Weg zur Lösung dieser Anforderung über die Abstrahierung des Registrierungszugriffs besteht. – Nkosi

+0

Ich muss mich als die tatsächliche Registrierung ausgeben, wie mache ich das? – VJL

Antwort

1

Wenn Sie es wollen Mock wirklich, für jeden Verbraucher über die Schnittstelle Abhängigkeit davon injizieren. Etwas wie:

public interface IRegistryService 
{ 
    bool CreateHkcuRegistry(string registryPath, string valueName, string value, RegistryValueKind valueKind = RegistryValueKind.String); 
} 

public class RegistryService : IRegistryService 
{ 
    public bool CreateHkcuRegistry(string registryPath, string valueName, string value, RegistryValueKind valueKind = RegistryValueKind.String) 
    { 
    try 
    { 
     RegistryKey key = Registry.CurrentUser.OpenSubKey(registryPath, true); 
     if (key != null) 
     { 
     key.SetValue(valueName, value, valueKind); 
     key.Close(); 
     } 
     else 
     { 
     RegistryKey newKey = Registry.CurrentUser.CreateSubKey(registryPath); 
        newKey.SetValue(valueName, value, valueKind); 
     } 
     return true; 
    }   
    } 
} 

Probe Nutzungsart:

public class ConsumerSample 
{ 
    privare IRegistryService _registryService; 

    public ConsumerSample(IRegistryService registryService) 
    { 
     _registryService = registryService; 
    } 

    public void DoStuffAndUseRegistry() 
    { 
     // stuff 
     // now let's save 
     _registryService.CreateHkcuRegistry("test","testValue","mytest"); 
    } 
} 


var consumer = new ConsumerSample(new RegistryService()); 

Dann reale Implementierung verwenden, wo gewünscht und verspotten sie in Tests, wo nötig.

+0

Während Einheit die oben genannte Funktion testet, sollte es nicht die Systemregistrierung berühren ... Also muss ich die Systemregistrierung verspotten – VJL

+0

@VJL dann müssen Sie einen Schein des 'IRegistryService' erstellen und diesen verwenden. Die Systemregistrierung zu verspotten ist zu weit, um auf eigene Faust zu tun. Zusammenfassung die Funktionalität, die Sie wollen, und dann verspotten. – Nkosi

+0

Dann gibt es keine Verwendung von Komponententests, wenn ich IRegistryService – VJL