2016-08-09 1 views
2

NUnit 3.4.1, JustMock 2016.2.713.2Puis-je gérer la chaîne insensible à la casse dans ma maquette?

je la classe en cours de test:

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

Aussi, j'ai le test GetAppSets méthode:

[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); 
} 

Il fonctionne. Mais mon test sera l'échec si la méthode GetAppSets utilise "Software \ Autodesk \ AutoCAD" ou "software \ autodesk \ autocad" string au lieu de "S OGICIELS \ Autodesk \ AutoCAD": la variable appSets sera null si chaîne de caractères sera changé (parce que cette clé de registre n'existe pas sur mon ordinateur).

Donc, à ce cas soit testeur a besoin de savoir la mise en œuvre de la méthode GetAppSets (la mauvaise variante), ou pour traiter le paramètre comme le insensible à la casse chaîne.

Est-il possible d'utiliser la deuxième variante?

Répondre

0

Il semble que la réponse par @Karolis manque le point de la question.

La bonne solution consiste à utiliser un comparateur dans le dispositif en fonction de la clé d'une manière insensible à la casse:

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); 

Dans le mockKey ci-dessus sera la même instance que mock, en raison de la mise en correspondance d'argument sur le premier argument.

1

Réponse à la question originale:

Vous pouvez utiliser une version surchargée de l'affirmation de l'égalité.

Assert.AreEqual(fakeSets, appSets, true); 

Signature:

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

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

Réponse à la question mise à jour:

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

Non, mon problème est autre. Le 'appSets' sera' null' si la chaîne de caractères sera modifiée (parce que cette clé de registre n'existe pas sur mon ordinateur). J'ai ajouté cette information supplémentaire dans mon sujet en ce moment. –

+0

Je vois ce que vous voulez dire. Il s'agit d'un test unitaire tel qu'indiqué dans vos balises, ainsi l'interaction avec d'autres composants tels que le registre est autorisée. Utilisez aussi un simulateur pour GetAppSets. – Karolis

+0

J'utilise un simulacre pour mes 'GetAppSets' dans mon test. J'utilise les frameworks NUnit et JustMock. –