2008-11-25 10 views
2

J'utilise des attributs personnalisés dans un projet et je voudrais les intégrer dans mes tests unitaires.Attributs moqueurs - C#

Maintenant j'utilise Rhino Mocks pour créer mes mocks mais je ne vois pas comment y ajouter mes attributs (et leurs paramètres).

Ai-je raté quelque chose, ou est-ce que ce n'est pas possible? Autre cadre moqueur? Ou dois-je créer des implémentations factices avec mes attributs? Exemple: J'ai une interface dans une architecture plugin (IPlugin) et il y a un attribut pour ajouter des méta-informations à une propriété. Ensuite, je cherche des propriétés avec cet attribut dans l'implémentation du plugin pour un traitement supplémentaire (stockage de sa valeur, marquer comme gui en lecture seule ...)

Maintenant, quand je crée un bidon je peux ajouter facilement un attribut à une propriété ou l'instance d'objet elle-même?

EDIT: J'ai trouvé un message avec la même question ->link. La réponse il n'y a pas 100% et il est Java ...

EDIT 2: Il peut être fait ... chercher un peu plus (sur le SO) et a trouvé 2 questions liées (+ réponses)

here et Maintenant, est-ce déjà mis en œuvre dans l'un ou l'autre cadre de simulation?

+0

Pouvez-vous fournir plus de détails sur ce que vous souhaitez tester? Je pense qu'un test unitaire bien conçu testerait l'attribut par lui-même, ou appliqué à une classe/membre factice. –

+0

a ajouté un exemple ... – bob

+2

Vous pourriez voter sur cette suggestion: [Possibilité d'ajouter des attributs personnalisés pour simuler l'objet] (http://nhprof.uservoice.com/forums/28152-rhino-mocks-4-0/suggestions/654931-ability-to-add -custom-attributes-to-mock-object). Pendant ce temps, voir [Puis-je demander à Moq d'ajouter des attributs à la classe fictive?] (Http://stackoverflow.com/questions/540636/can-i-get-moq-to-add-attributes-to-the-mock -classe). –

Répondre

1

Voici un exemple de la façon dont j'ai testé les attributs personnalisés. Dans ce cas, j'ai un attribut personnalisé qui est utilisé sur une méthode. Dans ma classe de test, j'ai créé une méthode d'espace réservé à laquelle l'attribut personnalisé est appliqué. J'ai ensuite utilisé la réflexion pour obtenir l'instance de l'attribut personnalisé.

[TestFixture] public class SomeRandomAttributeTest 
{ 
    [SomeRandom(RestrictionType.Local)] 
    public void PlaceholderMethodForAttribute() {throw new ApplicationException(this.ToString());} 

    [Test]public void BlahBlahIsBlahTheBlah() 
    { 
     object[] attributes = this.GetType().GetMethod("PlaceholderMethodForAttribute").GetCustomAttributes(false); 
     Assert.AreEqual(1, attributes.Length); 
     Assert.IsInstanceOfType(typeof(SomeRandomAttribute), attributes[0]); 

     Assert.AreEqual("Yada yada yada", ((SomeRandomAttribute) attributes[0]).Yada); 

    } 
} 
+0

Mais puis-je attacher cet attribut sur un simulacre, de sorte que je n'ai pas besoin de créer des espaces réservés? vois mon exemple. – bob

+1

Ahhhh mes yeux! Pour l'amour de , déplacez ces attributs au-dessus de la déclaration de classe/méthode. –

1

Pourquoi ne pouvez-vous faire quelque chose comme:

var sut = new SomeRandomAttribute(RestrictionType.Local); 
Assert.AreEqual("Yada yada yada", sut.Yada); 

Si vous souhaitez tester le code qui visite tous vos types et fait des choses pour chacun des SomeRandomAttribute « s il trouve , Je vous suggère de le découper en récupérant les objets MethodInfo qui sont décorés avec votre attribut personnalisé et les opérations qui doivent être effectuées sur ces objets. Ce dernier devrait être facile à tester étant donné que l'objet et l'attribut MethodInfo sont correctement configurés. Le premier pourrait être fait en utilisant des espaces réservés de test spécifiques pour votre attribut comme suggéré par Joseph.

+0

Le problème est qu'avec beaucoup d'attributs il n'y a aucune logique à tester. Parfois, ils ne sont que des marqueurs. Je recherche donc les implémentations IPlugin dans un assemblage, crée une instance et stocke certaines métadonnées/effectue une logique d'attribut. Et que je veux tester dans LoadPluginTest (IPlugin Mock) avec un simulacre. – bob

0

Cela dépend de ce que vous devez tester:

  • Test des « fonctionnalité » de l'attribut, si l'attribut que vous avez ajouté a un effet sur la classe/méthode, il vous décore pouvez créer un mannequin classe qui hérite IPlugin avec cet attribut et vérifie que son comportement a été affecté par l'attribut présence ou valeur.
  • Si vous souhaitez tester certaines fonctionnalités internes de l'attribut, créez simplement cet attribut et utilisez assert pour vérifier ce résultat final.

Je ne pense pas que vous ayez besoin de moquer ici.

+0

Je veux en effet tester la fonctionnalité, pas la logique interne, mais sans les tracas de créer des classes factices (ce que je fais maintenant), donc en utilisant un cadre moqueur. Mais il n'y a pas d'autre option je pense ... merci ... – bob