Modifier : Je viens de relire votre question et je me rends compte que je ne l'ai pas vraiment répondue. Je laisse ma réponse initiale car elle est liée, mais voici votre réponse spécifique :
La raison pour laquelle vous n'avez pas besoin d'un double est que vous remplacez les méthodes de classe, plutôt que les méthodes d'instance. double
est seulement utile pour traiter les instances de la classe, pas la classe elle-même.
Ancienne réponse expliquant un peu plus les doubles :
Vous devriez toujours utiliser de vraies classes au lieu de doubles de test lorsque vous le pouvez. Cela exercera plus de votre code et rendra vos tests plus complets. Les doubles de test sont utilisés dans des situations où vous ne pouvez pas ou ne devriez pas utiliser un objet réel. Par exemple, si une classe ne peut pas être instanciée sans accéder à une ressource externe (comme un réseau ou une base de données), ou possède un grand nombre de dépendances, et que vous testez simplement quelque chose qui l'utilise, vous voudrez peut-être créer un double et stubber certaines méthodes sur le double.
Voici un exemple plus spécifique : disons que vous testez MyClass
, mais pour instancier MyClass
, vous devez passer un FooLogger
:
mylogger = FooLogger.new
myclass = MyClass.new logger: mylogger
Si FooLogger.new
ouvre un socket syslog et commence à y envoyer du spam immédiatement, à chaque fois que vous lancez vos tests, vous serez en train de logger. Si vous ne voulez pas spammer vos logs pendant ce test, vous pouvez plutôt créer un double pour FooLogger
et stubber une méthode dessus :
mylogger = double(FooLogger)
mylogger.stub(:log)
myclass = MyClass.new logger: mylogger
Parce que la plupart des classes bien conçues peuvent être instanciées sans aucun effet secondaire, vous pouvez généralement simplement utiliser l'objet réel au lieu d'un double, et stubber les méthodes sur celui-ci. Il existe d'autres scénarios où les classes ont de nombreuses dépendances qui les rendent difficiles à instancier, et les doubles sont une façon de contourner le superflu et de tester la chose qui vous intéresse vraiment.
Dans mon expérience, le besoin d'utiliser un double est un signe d'alerte dans le code, mais nous devons souvent utiliser des classes que nous ne pouvons pas facilement changer (par exemple, à partir d'une gemme), donc c'est un outil dont vous pourriez avoir besoin de temps en temps.