Frage

Wenn Sie Jungs sind Einheit Testen einer Anwendung, die auf Werte aus einer app.config-Datei beruht? Wie testen Sie, dass diese Werte korrekt gelesen werden und wie Ihr Programm reagiert auf falsche Werte in einer Konfigurationsdatei eingegeben?

Es wäre lächerlich zu haben, die Konfigurationsdatei für die NUnit App zu ändern, aber ich kann nicht lesen in den Werten aus dem app.config Ich mag testen.

Edit: Ich denke, ich sollte vielleicht klären. Ich bin nicht besorgt über die Konfigurationsmanager die Werte zu lesen, andernfalls, aber ich bin besorgt darüber, mit testen, wie mein Programm auf die Werte reagiert lesen.

War es hilfreich?

Lösung

I isoliert in der Regel externe Abhängigkeiten wie mit sehr wenig Funktionalität eine Konfigurationsdatei in ihrer eigenen Fassade Klasse zu lesen. In Tests kann ich eine Mock-Version dieser Klasse, die implementiert und verwendet, die anstelle der realen Konfigurationsdatei. Sie können Ihre eigenen Mockup des oder verwenden Sie einen Rahmen wie moq oder Rhino Mocks für diese erstellen.

Auf diese Weise können Sie Ihren Code mit verschiedenen Konfigurationswerten ohne das Schreiben komplexe Tests, die ersten Schreib XML-Konfigurationsdateien einfach ausprobieren. Der Code, der die Konfiguration liest, ist in der Regel so einfach, dass es sehr wenig testen muss.

Andere Tipps

Sie können Ihre Konfigurations Abschnitt zur Laufzeit im Test-Setup ändern. Z. B:

// setup
System.Configuration.Configuration config = 
     ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
config.Sections.Add("sectionname", new ConfigSectionType());
ConfigSectionType section = (ConfigSectionType)config.GetSection("sectionname");
section.SomeProperty = "value_you_want_to_test_with";
config.Save(ConfigurationSaveMode.Modified);
ConfigurationManager.RefreshSection("sectionname");

// carry out test ...

Sie können Ihre eigenen Hilfsmethoden natürlich Setup elegant dies zu tun.

Sie können die Set-Methode von ConfigurationManager.AppSettings rufen die Werte für das jeweilige Gerät zu testen erforderlich einzustellen.

[SetUp]
public void SetUp()
{
  ConfigurationManager.AppSettings.Set("SettingKey" , "SettingValue");
  // rest of unit test code follows
}

Wenn das Gerät Test läuft es dann diese Werte verwenden, um den Code auszuführen

Sie können sowohl lesen als auch auf die app.config Datei mit der ConfigurationManager Klasse schreiben

Ich war mit ähnlichen Problemen mit web.config .... Ich finde eine interessante Lösung. Sie können Konfigurationslesefunktion einkapseln, z.B. so etwas wie folgt aus:

public class MyClass {

public static Func<string, string> 
     GetConfigValue = s => ConfigurationManager.AppSettings[s];

//...

}

Und dann normalerweise verwenden

string connectionString = MyClass.GetConfigValue("myConfigValue");

aber in Unit-Test initialisieren "überschreiben" die Funktion wie folgt aus:

MyClass.GetConfigValue = s =>  s == "myConfigValue" ? "Hi", "string.Empty";

Weitere Informationen:

http: // rogeralsing. com / 2009/05/07 / the-einfachste-Form-of-konfigurierbaren Abhängigkeit-Injektion /

Eine elegantere Lösung ist, sich die gute alte Dependency Injection auf den Konfigurationseinstellungen zu verwenden. IMHO ist dies sauberer als mit einer Konfiguration Lese Klasse / Wrapper etc zu verspotten.

Zum Beispiel sagen, eine Klasse „Wetter“ erfordert eine „ServiceUrl“, um zu funktionieren (z sagen, dass es einen Web-Service ruft das Wetter zu bekommen). Anstatt eine Codezeile, die die aktiv in eine Konfigurationsdatei geht diese Einstellung zu erhalten (ob dieser Code in der Wetter Klasse sein oder einen separaten Konfigurationsleser, der als pro einigen der anderen Antworten verspottet werden könnte), kann das Wetter Klasse ermöglichen die Einstellung für den Konstruktor injiziert, entweder über einen Parameter werden, oder möglicherweise über eine Eigenschaft Setter. Auf diese Weise sind die Unit-Tests sehr einfach und direkt, und weiß nicht einmal benötigen spöttisch.

Der Wert der Einstellung kann dann eine Inversion of Control injiziert werden (oder Dependency Injection) Behälter, so dass die Verbraucher von der Wetter Klasse brauchen nicht explizit von irgendwo um den Wert zu liefern, wie es durch den Behälter behandelt wird.

Das funktioniert für mich:

 public static void BasicSetup()
  {
     ConnectionStringSettings connectionStringSettings = 
          new ConnectionStringSettings();
     connectionStringSettings.Name = "testmasterconnection";
     connectionStringSettings.ConnectionString = 
          "server=localhost;user=some;database=some;port=3306;";
     ConfigurationManager.ConnectionStrings.Clear();
     ConfigurationManager.ConnectionStrings.Add(connectionStringSettings);
  }

Sie können immer das Einlesen in wickeln Bit in einer Schnittstelle und eine spezifische Implementierung aus der Konfigurationsdatei lesen. Sie würden dann Tests schreiben Mock Objects, um zu sehen, wie das Programm schlecht Werte behandelt. Persönlich würde ich nicht diese spezifische Implementierung testen, wie dieser Code .NET Framework ist (und ich gehe davon aus - hoffentlich - die MS hat es schon getestet).

System.Configuration.Abstractions ist eine Sache der Schönheit, wenn es um die Prüfung dieser Art von Sachen kommt.

Hier ist der GitHub Projekt vor Ort mit einigen guten Beispielen: Link-Beschreibung gibt hier

Hier ist die NuGet Website: https://www.nuget.org/packages /System.Configuration.Abstractions/

Ich benutze dies in fast allen meiner .NET-Projekten.

Eigentlich auf sie denken weiter, nehme ich an, was soll ich tun, ist eine ConfigFileReader Klasse für die Verwendung in meinem Projekt erstellen und dann gefälschte es in der Einheit Test-Harnisch aus?

Ist das die übliche Sache zu tun?

Die einfachste Möglichkeit ist es, die Methoden zu wickeln, die Konfiguration so zu lesen, dass Sie in Werten während der Prüfung ersetzen können. Erstellen Sie eine Schnittstelle, die Sie für das Lesen von Config verwenden und haben eine Implementierung dieser Schnittstelle erhalten als Konstrukteur Parameter oder einen Satz auf das Objekt als eine Eigenschaft übergeben (wie würden Sie Dependency Injection / Inversion of Control verwenden). In der Produktionsumgebung, passiert in einer Implementierung, die wirklich von der Konfiguration liest; in der Testumgebung in einer Testimplementierung übergeben, die einen bekannten Wert zurückgibt.

Wenn Sie nicht die Möglichkeit haben, den Code für die Testbarkeit Refactoring dennoch testen müssen, bietet Typemock Trenner die Fähigkeit, tatsächlich die .NET-Framework Konfigurationsklassen zu verspotten, so dass Sie nur „das nächste Mal sagen, kann ich für eine solche fragen -and-so appSettings Wert, senden Sie diesen bekannten Wert. "

Ich hatte das gleiche Problem,

Sie verwenden können Nunit-console.exe c: \ path1 \ testdll1.dll c: \ path2 \ testdll2.dll

das funktioniert gut, obwohl, wenn beide DLLs auf unterschiedliche app.configs zeigen ex testdll1.dll.config und testdll2.dll.config

Wenn Sie Nunit Projekt Config verwenden möchten, und wickeln diese zwei DLLs dann gibt es keine Möglichkeit, zwei configs haben

Sie haben project1.config haben, wenn Ihr Nunit Projekt in der gleichen Position project1.nunit als Project1.nunit sitzt.

hoffe, das hilft

Nun, ich hatte gerade das gleiche Problem ... Ich wollte ein BL-Projekt testen, die von einer Website verwiesen wird. aber ich wollte nur die BL testen. So in der Pre-Build-Ereignis des Testprojekts ich kopieren Sie die app.config-Dateien in das bin \ debug-Ordner und verweisen sie von der app.config ...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top