7
votes

Comment Test Test Singleton Classe - C ++?

Quels sont les moyens d'appuyer sur un motif singleton à C ++? (avec des exemples s'il vous plaît)


11 commentaires

Cela ressemble à deux questions plutôt distinctes. Peut-être que vous pourriez déplacer la partie d'injection de dépendance dans une nouvelle question?


@Georgfritzsche Injection de dépendance est un moyen de tester unitaire, n'est-ce pas?


"Injecter un singleton dans ..." et "Unité testant un singleton" sont deux sujets différents.


@Georgfritzsche Le lien dit que "une injection de dépendance serait un moyen de tester unitaire", est-ce que c'est faux?


@Georgfritzsche a modifié la question. :)


Dupliqué possible de Qu'est-ce qui est si mauvais sur les singletons?


@MikeSeyMour Duplicaté ??? Je demande ici les "façons", pas les inconvénients.


@Anishakaul: Ce n'est pas ce que la question posée à l'origine, et je ne peux pas supprimer mon vote maintenant que vous l'avez changé. Quoi qu'il en soit, cette question fournit des informations utiles sur la difficulté de tester une unité de test de manière intrinsèquement intense.


Pourquoi avez-vous éditer cette question si tellement qu'elle n'indique aucune relation avec la question initiale - et vous avez commencé une autre question dans un vain similaire?


@Edheal "tellement" ?? J'ai simplement supprimé un formulaire "deuxième" question ".


J'aime vraiment cette HelperCode.com/2015 / 09/16 / Comment-à-faux-a-singleton-in-c


4 Réponses :


1
votes

Un singleton n'est qu'une classe dont vous ne pouvez avoir qu'une seule instance. Comment trouvez-vous que cette instance ne fait pas partie de ce modèle, il est donc tout à fait d'utiliser DI avec un singleton tout va bien.

Test de l'unité Le singleton-motif est difficile, c'est l'un des arguments principaux contre l'utilisation. Une façon de le faire en C ++ consiste à définir le singleton dans une unité de compilation distincte, de sorte que vous puissiez créer un lien avec une implémentation simulée lors du test de cours qui utilisent le singleton.


0 commentaires

2
votes

C'est comme ça que je le ferais xxx

puis pour tester je créerais juste à des fins de test xxx

puis utilisez testsingleton - Donc, vous êtes capable d'effectuer tous les cas de test et de vous assurer que le début de l'instance est recréé.


3 commentaires

Vous n'avez pas créé le constructeur privé?


C'est le "..." - j'ai supposé que vous pourriez remplir ces bits.


Je pensais que c'était délibéré de votre part.



2
votes

Supposons que nous ayons le classique singleton anti-motif, responsable de trois choses: xxx

et une classe qui dépend de cette suivante: xxx

Nous souhaitons maintenant écrire un test d'unité pour le singleton: xxx

et pour la classe dépendante: xxx

Nous voyons qu'il y a trois problèmes à surmonter:

  1. Nous ne pouvons pas créer et détruire des instances pendant les tests;
  2. Nous ne pouvons pas définir nos propres sous-classes pour tester la manière dont l'interface est utilisée;
  3. Nous ne pouvons pas fournir notre propre dépendance à la classe dépendante.

    Le moyen le plus simple de surmonter ces problèmes est de refactoriser la classe Singleton:

    1. Faites le constructeur et destructeur public, en déplaçant la responsabilité de la gestion de la vie hors de la classe;
    2. Faites l'interface Résumé, nous permettant de définir nos propres implémentations;
    3. Supprimez l'instance globale et modifiez les classes dépendantes pour prendre sa dépendance par référence.

      alors maintenant nos classes ressemblent à: xxx

      La classe est facile à tester et presque aussi facile à utiliser en production (vous avez juste besoin de Créez une instance de realsingleton et transmettez-la sur l'endroit où ils sont nécessaires). Le seul problème est que vous ne pouvez plus l'appeler un singleton.


1 commentaires

Je vais suivre bientôt, ici et sur votre autre réponse. Merci.



13
votes

Faites de la mise en œuvre du Singleton une classe distincte et faites une emballage qui implémente la "singlettonness" à l'extérieur. De cette façon, vous pouvez tester la mise en œuvre autant que vous le souhaitez (à l'exception du comportement du singleton qui est trivial et inutile.

class SingletonImpl {
public:
  int doit(double,double);
};

class Singleton {
public:
  Singleton& instance() {...}
  int doit(double a,double b) {impl->doit(a,b);}
  ...
private:
  SingletonImpl impl;
}