10
votes

Comment se moquer Nsdate à Swift?

Je dois tester un calcul de la date, mais pour le faire, j'ai besoin de moquer nsdate () à Swift. Toute l'application est écrite en rapide et j'aimerais écrire un test de test.

J'ai essayé la méthode Swizzling mais cela ne fonctionne pas (ou je fais quelque chose de mal qui est plus probable). xxx

test: xxx

mais date est toujours la date actuelle.


2 commentaires

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.


3 Réponses :


4
votes

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.

Spécifiquement pour votre problème Swizzling, IIRC NSDate 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.


0 commentaires

9
votes

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.

Je devais créer une classe de mémoire tampon entre Nsdate et mon code: xxx

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. xxx

puis dans le test Créer une simule qui hérite de l'original DateHandler () et "Inject" que dans le code à être testé: xxx


1 commentaires

J'ai fini avec une solution similaire, je vais donc accepter cette réponse :)



3
votes

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
}


4 commentaires

Crasuit sur les simulateurs 32 bits # 1 0x006ded32 in (Espace de noms anonyme) :: AutoreleeeePoolPage :: POP (vide *) ()


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 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