2010-01-27 3 views
2

Lié au question d'hier. J'ai mis en œuvre le solution proposé par Mehrdad Afshari mais cela a causé un autre problème. Pour récapituler: J'ai une classe contenant un dictionnaire de Type->IList<Type> par exemple. Cat->{cat1, cat2}, Zebra->{zebra1, zebra2}Cat et Zebra sont des sous-classes de Animal. Maintenant Mehrdad proposé la méthode suivante pour récupérer les tous les animaux d'un certain type:Rhino Mock stub renvoie un type différent de expected et casse mon test unitaire

IList<T> GetAnimalsOfType<T>() where T : Animal { 
    return dictionary[typeof(T)].OfType<T>().ToList(); 
} 

Cela fonctionne, mais casse mon test unitaire. La raison en est que Animal est une classe abstraite et j'utilise donc Rhino Mocks pour le stub (en utilisant animal = MockRepository.GenerateStub<Animal>();). Mon test d'unité pour cette classe essaie de créer un nouvel animal, puis de voir s'il est inclus dans le dictionnaire.

zoo.AddAnimal(animal); 
IList<Animal> animals= zoo.GetAnimalsOfType<Animal>(); 
Assert.That(animals[0], Is.EqualTo(animal)); 

Malheureusement, le type d'animal créé par Rhino Mocks est un proxy animal et je demande des animaux, qui brise mon test. Des suggestions sur la façon de corriger la situation?

Mise à jour: merci à tous pour les solutions.

+0

Pouvez-vous poster votre code de test? –

+0

C'est juste là. – Johnny

Répondre

1

Comme vous ne pouvez pas utiliser ce dû au compilateur avoir besoin de connaître le type à l'avance:

zoo.AddAnimal(animal); 
IList<Animal> animals= zoo.GetAnimalsOfType<typeof(animal)>(); 
Assert.That(animals[0], Is.EqualTo(animal)); 

Je pense que vous devrez rouler votre propre maquette:

class MockAnimal : Animal 
{ 
} 

zoo.AddAnimal(new MockAnimal()); 
IList<Animal> animals= zoo.GetAnimalsOfType<MockAnimal>(); 
Assert.That(animals[0], Is.EqualTo(animal)); 

aussi est-ce que vous ne voulez pas vérifier que l'instance retournée n'est pas la même que celle qui a été ajoutée, plutôt que juste égale à? (Pas sûr de la syntaxe, vous avez encore le Asset.AreSame() ici)

Assert.That(animals[0], Is.SameAs(animal)); 

ne est pas surprenant l'autre ne fonctionne pas comme vous voulez que le GetAnimalsOfType pour retourner uniquement les animaux du type exact ne pas vous, pas les types qui sont dérivés de cela? Si vous avez fait ceci:

class Tiger : Animal 
{ 
} 

zoo.AddAnimal(new Tiger()); 
IList<Animal> animals= zoo.GetAnimalsOfType<Animal>(); 

voulez-vous attendre à ce que le passage:

Assert.AreEqual(1, animals.Count); 

Je suppose que non. Si vous voulez faire ce que vous avez décrit, je pense que vous devrez créer un animal réel pas un simulacre.

+0

En fait votre première suggestion ne fonctionnerait pas puisque le compilateur doit savoir avant l'exécution quel type je demande dans 'zoo.GetAnimalsOfType ()' et en utilisant 'zoo.GetAnimalsOfType ()' le type ne peut pas être connu à l'avance. – Johnny

+0

alors je pense que vous êtes coincé avec l'aide d'un vrai animal ou rouler votre propre maquette et en utilisant le type de cela. Je vais éditer la réponse. –

2

Vous pouvez demander le type spécifique que vous venez d'insérer. Vous devez créer une fonction d'assistance:

T Get<T>(T parameterOnlyToInferTheType) 
{ 
    IList<Animal> animals= zoo.GetAnimalsOfType<T>(); 
    return animals[0]; 
} 

animal = MockRepository.GenerateStub<Animal>(); 
zoo.AddAnimal(animal); 
Animal expected = Get(animal); 
Assert.That(expected, Is.EqualTo(animal)); 

Cela semble un peu douteux, mais devrait fonctionner.

En général, j'ai tendance à éviter de saisir des collections sur le type, donc je n'ai pas ces problèmes (par exemple j'ai une propriété sur la classe qui retourne une énumération, etc.).

Questions connexes