Puis-je obtenir que Moq ajoute des atsortingbuts à la classe fictive?

J’écris une interface de ligne de commande pour mon projet. L’utilisateur entre “create project foo” et trouve le contrôleur responsable de “projet”, puis appelle la méthode Create passant “foo” comme premier argument.

Il repose fortement sur les atsortingbuts et la reflection: le contrôleur ressemble à ceci:

 [ControllerFor("project")] class ProjectController { [ControllerAction("create")] public object Create(ssortingng projectName) { /* ... */ } } 

J’aimerais utiliser Moq dans les tests unitaires de l’parsingur, comme ceci:

 Mock controller = new Mock(); controller.Expect(f => f.Create("foo")); parser.Register(controller.Object); parser.Execute("create project foo"); controller.VerifyAll(); 

L’ajout d’atsortingbuts à l’interface ne semble pas fonctionner – ils ne sont pas hérités par les classes dérivées.

Puis-je obtenir que Moq ajoute des atsortingbuts à la classe dont on se moque?

Mise à jour: Je viens de me rendre compte que vous pouvez réellement append des atsortingbuts à un type existant en utilisant TypeDescriptor.AddAtsortingbutes , qui peut être exécuté sur une instance ou un type:

 Mock repositoryMock = new Mock(); CustomAtsortingbute atsortingbute = new CustomAtsortingbute(); // option #1: to the instance TypeDescriptor.AddAtsortingbutes(repositoryMock.Object, atsortingbute ); // option #2: to the generated type TypeDescriptor.AddAtsortingbutes(repositoryMock.Object.GetType(), atsortingbutes); 

Si vous en avez besoin, AddAtsortingbute renvoie un TypeDescriptorProvider pouvant être transmis à TypeDescriptor.RemoveProvider pour supprimer les atsortingbuts ultérieurement.

Sachez que Atsortingbute.GetCustomAtsortingbutes ne trouvera pas les atsortingbuts ajoutés au moment de l’exécution de cette manière. Au lieu de cela, utilisez TypeDescriptor.GetAtsortingbutes .

Réponse originale

Je ne crois pas que Moq (ou tout autre framework moqueur) supporte les atsortingbuts personnalisés. Je sais que Castle Proxy (le framework couramment utilisé pour créer la classe) le supporte, mais il n’y aurait aucun moyen d’y accéder via Moq.

Votre meilleur choix est de résumer votre méthode de chargement des atsortingbuts dans une interface (qui accepte le type et le type d’atsortingbut), puis de la simuler.

Edit: Par exemple:

 public interface IAtsortingbuteStrategy { Atsortingbute[] GetAtsortingbutes(Type owner, Type atsortingbuteType, bool inherit); Atsortingbute[] GetAtsortingbutes(Type owner, bool inherit); } public class DefaultAtsortingbuteStrategy : IAtsortingbuteStrategy { public Atsortingbute[] GetAtsortingbutes(Type owner, Type atsortingbuteType, bool inherit) { return owner.GetCustomAtsortingbutes(atsortingbuteType, inherit); } public Atsortingbute[] GetAtsortingbutes(Type owner, bool inherit) { return owner.GetCustomAtsortingbutes(inherit); } } 

La classe qui a besoin d’atsortingbuts utilise une instance de IAtsortingbuteStrategy (soit via un conteneur IoC, soit éventuellement transmise au constructeur). Ce sera généralement une DefaultAtsortingbuteStrategy, mais vous pouvez maintenant vous moquer de IAtsortingbuteStrategy afin de remplacer la sortie.

Cela peut sembler compliqué, mais append une couche d’abstraction est beaucoup plus facile que d’essayer de simuler des atsortingbuts.