2009-11-05 5 views
3

Comment vérifieriez-vous les paramètres d'une fonction qui accepte un dictionnaire? Fondamentalement, je veux vérifier que le paramètre pour GetCodes a les mêmes valeurs que la variable "someDictionary".Contraintes de Rhino Mocks et paramètres de dictionnaire

J'ai oublié de mentionner que la méthode testée construit le dictionnaire et le transmet à la méthode someService.GetCodes().

public void SomeOtherMethod() { 
    IDictionary<string, string> dict = new Dictionary<string, string> { 
    {"Key 1", "Value 1"}, 
    {"Key 2", "Value 2"} 
    }; 

    someService.GetCodes(dict); // This would pass! 

    IDictionary<string, string> dict2 = new Dictionary<string, string> { 
    {"Key 1", "Value 1a"}, 
    {"Key 2a", "Value 2"} 
    }; 

    someService.GetCodes(dict2); // This would fail! 

} 

, je veux vous assurer que le dictionnaire est passé à la méthode GetCodes contiennent les mêmes que celle de la Expect.Call spécifiées ... méthode.

Un autre cas d'utilisation serait peut-être que je veux juste voir si les clés du dictionnaire contiennent "Clé 1" et "Clé 2", mais ne se soucient pas des valeurs ... Ou le tour autour.

Répondre

6
// arrange 
IDictionary<string, string> someDictionary = new Dictionary<string, string> { 
    { "Key1", "Value1" }, 
    { "Key2", "Value2" } 
}; 
ISomeService someService = MockRepository.GenerateStub<ISomeService>(); 

// act: someService needs to be the mocked object 
// so invoke the desired method somehow 
// this is usually done through the real subject under test 
someService.GetCodes(someDictionary); 

// assert 
someService.AssertWasCalled(
    x => x.GetCodes(someDictionary) 
); 

MISE À JOUR:

Voilà comment vous pouvez affirmer des valeurs d'argument:

someService.AssertWasCalled(
    x => x.GetCodes(
     Arg<IDictionary<string, string>>.Matches(
      dictionary => 
       dictionary["Key1"] == "Value1" && 
       dictionary["Key2"] == "Value2" 
     ) 
    )  
); 

Update2:

Comme suggéré par @mquander dans les commentaires, la affirmation précédente pourrait être raccourcie en utilisant LINQ:

someService.AssertWasCalled(
    x => x.GetCodes(
     Arg<IDictionary<string, string>>.Matches(
      dictionary => 
       dictionary.All(pair => someDictionary[pair.Key] == pair.Value) 
     ) 
    ) 
); 
+0

Je ne suis pas sûr que ce soit la solution que je recherchais. Ce que je veux vérifier, ce sont les valeurs du dictionnaire, pas nécessairement le même dictionnaire. –

+0

Si vous vérifiez que c'est la même référence de dictionnaire cela implique qu'il a les mêmes valeurs, donc mettre des valeurs dans le dictionnaire n'est pas nécessaire. J'ai mis à jour mon message pour montrer comment vous pouvez vérifier qu'une méthode d'objet mockée a été appelée avec des arguments spécifiques. –

+0

Je ne sais rien à propos de Rhino Mocks, mais ne pourriez-vous pas simplement remplacer le corps du prédicat dans le "UPDATE" ci-dessus et le changer à quelque chose comme dictionary => dictionary.All (pair => someDict [paire.Key] == pair.Value)? – mquander