Il n'y a pas deux manières à ce sujet. Les suggestions de ReSharper et plusieurs fonctionnalités utiles de C # ne seraient pas utilisées aussi souvent si vous écriviez des tests d'unité atomique isolés pour tout votre code.
Par exemple, si vous avez une méthode statique et que vous devez l'exclure, vous ne pouvez pas le faire sauf si vous utilisez un cadre d'isolation basé sur un profil. Une solution de contournement compatible avec les appels consiste à modifier le haut de la méthode pour utiliser la notation lambda. Par exemple:
AVANT:
public static DBConnection ConnectToDB( string dbName, string connectionInfo ) {
}
APRÈS:
public static Func<string, string, DBConnection> ConnectToDB (dbName, connectionInfo ) {
};
Les deux sont compatibles avec les appels. Les appelants n'ont pas à changer. Le corps de la fonction reste le même.
Ensuite, dans votre code de test unitaire, vous pouvez stub cet appel comme suit (en supposant qu'il soit dans une classe appelée Database):
Database.ConnectToDB = (dbName, connectionInfo) => { return null|whatever; }
Veillez à le remplacer par la valeur d'origine une fois que vous avez terminé. Vous pouvez le faire via try / finally ou, lors du nettoyage d'un test un, celui qui est appelé après chaque test, écrivez un code tel que celui-ci:
[TestCleanup]
public void Cleanup()
{
typeof(Database).TypeInitializer.Invoke(null, null);
}
qui ré-invoquera l'initialiseur statique de votre classe.
Les fonctions lambda ne sont pas aussi riches en support que les méthodes statiques classiques, cette approche a donc les effets secondaires indésirables suivants:
- Si la méthode statique était une méthode d'extension, vous devez d'abord la remplacer par une méthode autre que d'extension. Resharper peut le faire pour vous automatiquement.
- Si l'un des types de données des méthodes statiques est un assemblage imbriqué-interopéré, comme pour Office, vous devez envelopper la méthode, envelopper le type ou le changer en type 'objet'.
- Vous ne pouvez plus utiliser l'outil de refactoring de changement de signature de Resharper.
Mais supposons que vous évitiez complètement la statique et que vous convertissiez cela en une méthode d'instance. Ce n'est toujours pas mockable sauf si la méthode est virtuelle ou implémentée dans le cadre d'une interface.
Donc, en réalité, quiconque suggère que le remède aux méthodes statiques réductrices consiste à en faire des méthodes d'instance, ils seraient également opposés aux méthodes d'instance qui ne sont pas virtuelles ou ne font pas partie d'une interface.
Alors pourquoi C # a-t-il des méthodes statiques? Pourquoi autorise-t-il les méthodes d'instance non virtuelle?
Si vous utilisez l'une de ces "fonctionnalités", vous ne pouvez tout simplement pas créer de méthodes isolées.
Alors quand les utilisez-vous?
Utilisez-les pour tout code dont vous ne vous attendez pas à ce que quelqu'un veuille se démarquer. Quelques exemples: la méthode Format () de la classe String la méthode WriteLine () de la classe Console la méthode Cosh () de la classe Math
Et encore une chose ... La plupart des gens ne s’en soucieront pas, mais si vous le pouvez sur la performance d’un appel indirect, c’est une autre raison pour éviter les méthodes d’instance. Il y a des cas où c'est un coup dur pour la performance. C'est pourquoi les méthodes non virtuelles existent en premier lieu.