2016-08-09 104 views
2

NUnit 3.4.1, JustMock 2016.2.713.2Kann ich die Groß-/Kleinschreibung in meinem Pseudonym behandeln?

Ich habe die Klasse im Test:

public class AppManager { 
    public string[] GetAppSets() => Registry.LocalMachine 
     .OpenSubKey(@"SOFTWARE\Autodesk\AutoCAD", false) 
     ?.GetSubKeyNames(); 
} 
Auch

, ich habe den Test für GetAppSets Methode:

[Test] 
public void GetAppSets_Returns_ValidValue() { 

    const string subkey = @"SOFTWARE\Autodesk\AutoCAD"; 
    /* The sets of applications which are based on 
    * AutoCAD 2009-2017. */ 
    string[] fakeSets = new[] { "R17.2", "R18.0", 
     "R18.1", "R18.2", "R19.0", "R19.1", "R20.0", 
     "R20.1","R21.0" }; 

    RegistryKey rk = Mock.Create<RegistryKey>(); 

    Mock.Arrange(() => rk.GetSubKeyNames()).Returns(
     fakeSets); 

    Mock.Arrange(() => Registry.LocalMachine.OpenSubKey 
    (subkey, false)).Returns(rk); 

    AppManager appMng = new AppManager(); 
    string[] appSets = appMng.GetAppSets(); 

    Assert.AreEqual(fakeSets, appSets); 
} 

Es funktioniert. Aber mein Test Versagen, wenn GetAppSets Methode verwendet "Software \ Autodesk \ AutoCAD" oder "Software \ autodesk \ autocad" string anstelle von "S OFTWARE \ Autodesk \ AutoCAD": die appSets Variable null sein wird, wenn String Case wird geändert (weil dieser Registrierungsschlüssel auf meinem Computer nicht existiert).

Also, in diesem Fall entweder Tester benötigen die GetAppSets Methode Implementierung (die schlechte Variante) zu wissen, oder Parameter wie die Groß- und Kleinschreibung Zeichenfolge zu behandeln.

Ist es möglich, die zweite Variante zu verwenden?

Antwort

0

Es scheint, dass die Antwort von @Karolis trifft nicht den Punkt der Frage.

Die richtige Lösung ist, eine Matcher in der Anordnung zu verwenden, um den Schlüssel in einem Fall unempfindliche Art und Weise entsprechen:

var mock = Mock.Create<RegistryKey>(); 
    Mock.Arrange(() => Registry.LocalMachine.OpenSubKey(
     Arg.Matches<string>(s => StringComparer.OrdinalIgnoreCase.Equals(s, @"SOFTWARE\Autodesk\AutoCAD")), 
     Arg.AnyBool) 
    ).Returns(mock); 


    var mockKey = Registry.LocalMachine.OpenSubKey(@"software\autodesk\autocad", false); 

In den obigen mockKey wird das gleiche Beispiel wie mock wegen des Arguments Matcher sein auf das erste Argument.

1

Antwort ursprüngliche Frage:

Sie können eine überladene Version der Gleichheit Behauptung verwenden.

Assert.AreEqual(fakeSets, appSets, true); 

Signatur:

public static void AreEqual(
string expected, 
string actual, 
bool ignoreCase) 

Quelle: https://msdn.microsoft.com/en-us/library/ms243448.aspx

Antwort aktualisiertem Frage:

for(int i = 0; i < appSets.Length, i++) 
{ // If there is mismatch in length Exception will fail the test. 
    Assert.AreEqual(fakeSets[i], appSets[i], true); 
} 
+0

Nein, mein Problem ist ein anderes. Die 'appSets' werden 'null', wenn der String-Case geändert wird (weil dieser Registrierungsschlüssel auf meinem Computer nicht existiert). Ich habe diese Zusatzinfo jetzt in mein Thema eingefügt. –

+0

Ich sehe Ihren Standpunkt. Es ist ein Komponententest, wie in Ihren Tags angegeben, daher ist die Interaktion mit anderen Komponenten wie der Registrierung zulässig. Verwenden Sie eine Kopie für GetAppSets. – Karolis

+0

Ich benutze einen Mock für meine 'GetAppSets' in meinem Test. Ich benutze NUnit und JustMock Frameworks. –