Je dois tester un calcul de la date, mais pour le faire, j'ai besoin de moquer J'ai essayé la méthode Swizzling mais cela ne fonctionne pas (ou je fais quelque chose de mal qui est plus probable). p> test: p> mais nsdate () code> à Swift. Toute l'application est écrite en rapide et j'aimerais écrire un test de test.
date code> est toujours la date actuelle. P> p>
3 Réponses :
Plutôt que d'utiliser Swizzling, vous devez vraiment concevoir votre système pour prendre en charge les tests. Si vous faites beaucoup de traitement de données, vous devez injecter la date appropriée dans les fonctions qui l'utilisent. De cette façon, votre test injecte les dates dans ces fonctions pour les tester et vous avez d'autres tests qui vérifient que les dates correctes seront injectées (lorsque vous coupez les méthodes qui utilisent les dates) pour diverses autres situations. P>
Spécifiquement pour votre problème Swizzling, IIRC NSDate code> est une cluster de classe de classe de sorte que la méthode que vous remplacer est peu susceptible d'être appelée comme une classe différente sera créée et retournée silencieusement. P >
Clause de non-responsabilité - Je suis nouveau à des tests rapides afin que cela puisse être une solution horriblement hacky, mais j'ai eu des difficultés avec cela aussi, j'espère que cela aidera quelqu'un à sortir.
J'ai trouvé Cette explication est une aide énorme. p>
Je devais créer une classe de mémoire tampon entre Nsdate et mon code: p> a ensuite utilisé la classe tampon dans n'importe quel code utilisé NSDate (), fournissant la date de date par défaut () en tant qu'argument facultatif. p> puis dans le test Créer une simule qui hérite de l'original DateHandler () et "Inject" que dans le code à être testé: p>
J'ai fini avec une solution similaire, je vais donc accepter cette réponse :)
Si vous voulez swizzle, vous devez swizzle d'une classe utilisée en interne par nsdate code> et c'est
__ nsplaceholderdate code>. Utilisez ceci uniquement pour les tests car il s'agit d'une API privée.
let date = NSDate(timeIntervalSince1970: 946684800) // 2000-01-01
timeTravel(to: date) {
print(NSDate()) // 2000-01-01
}
Crasuit sur les simulateurs 32 bits # 1 0x006ded32 in (Espace de noms anonyme) :: AutoreleeeePoolPage :: POP (vide *) () Code>
Il ne fonctionne pas avec Swift 3 et la date (), je ne peux pas comprendre comment le réparer
@Abadiuszmatiecki Il n'y a aucun moyen de le faire fonctionner avec Date code> introduit à Swift car il est un type swift natif et Swizzling ne fonctionnera pas avec elle. Vous devez utiliser l'approche avec une classe d'horloge.
C'est ce que je pensais, mais je n'ai pas pu trouver une réponse définitive. J'ai finalement créé une classe d'horloge
Pourquoi n'éteignez-vous pas simplement votre système automatique de la date et de votre heure de votre système, modifiez la date de votre ordinateur et faites vos tests
Nous exécutons des tests sur Mac distant qui est connecté à la solution CI. Je ne veux trop te gâcher avec cet ordinateur.