2017-08-28 4 views
0

Ich habe eine Klasse, in der es einen Parameter weniger Konstruktor gibt. Wenn dieser Konstruktor aufgerufen wird, gibt es fünf Eigenschaften der Klasse, die Werte aus der Konfigurationsdatei im Konstruktor abrufen. Es gibt zwei Methoden in der Klasse, die die Parameter verwenden, die im Konstruktor initialisiert werden.Wie Konfig-Datei für Komponententest zu tun

Ich möchte Komponententest für zwei Methoden mit Mock Framework schreiben. Aber ich bin mir nicht sicher, wie man die Parameter im Konstruktor initialisiert, da der Aufruf der Methode den Wert für diese Eigenschaften nicht liefert.

public class ABC 
{ 
    public ABC() 
    { 
     a = ConfigurationManager.AppSetting["GetValue"]; 
     b = ConfigurationManager.AppSetting["GetValue1"]; 
    } 

    public int Method1(IDictionary<string, string> dict) 
    { 
     d = a + b /2; (how to mock values of a and b while writing unit tests 
        using mock framework. In reality, a in my case is 
        dictionary) 

//some business logic 

     return d; 
    } 
} 

Dankbarkeitskreuzes im Voraus,

+0

Es gibt keine Mocks, da der Konstruktor eng an 'ConfigurationManager' gekoppelt ist. Sie könnten jedoch die benötigten Schlüssel/Wert-Paare zur app.config des Komponententests hinzufügen. Ich kann nicht viel mehr sagen, da die bereitgestellten Informationen spärlich sind. Stellen Sie einen [mcve] bereit, der verwendet werden kann, um das tatsächliche Problem zu replizieren und beim Erstellen einer möglichen Lösung zu helfen. – Nkosi

+0

Verwenden Sie einen Wrapper um den Konfigurationsmanager und spotten Sie über den Wrappertyp. Siehe [hier] (https://stackoverflow.com/questions/9486087/how-to-mock-configurationmanager-appsettings-with-moq) – Nilesh

Antwort

2

Sie können nicht Mock Werte von a und b, wie Sie den Code fest mit app.config Datei gekoppelt ist. Sie können eine Schnittstelle erstellen. Umgestalten Code wie unten eine Schnittstelle zu Ihnen Konstruktor zu injizieren und dann verspotten,

public class ABC 
    { 
     private int a; 
     private int b; 
     public ABC(IConfig config) 
     { 
      a = config.a; 
      b = config.b; 
     } 

     public int Method1(IDictionary<string, string> dict) 
     { 
      int d = a + b/2; 

      return d; 
     } 
    } 

    public interface IConfig 
    { 
     int a { get; } 
     int b { get; } 
    } 
    public class Config : IConfig 
    { 
     public int a => Convert.ToInt32(ConfigurationManager.AppSettings["GetValue"]); 
     public int b => Convert.ToInt32(ConfigurationManager.AppSettings["GetValue1"]); 
    } 

Und Sie testen Klasse Mock und injizieren iConfig wie unten,

Mock<IConfig> _mockConfig = new Mock<IConfig>(); 

     _mockConfig.Setup(m => m.a).Returns(1); 
     _mockConfig.Setup(m => m.b).Returns(2); 

     ABC abc = new ABC(_mockConfig.Object); 

Jetzt Ihr Code mit App entkoppelt. config und Sie erhalten Mock-Werte von a und b, während Sie den Komponententest ausführen.

+0

Vielen Dank @ Vijaynath. Das ist eine großartige Lösung. – Vicky