10
votes

Scala: motif moqueur et le motif de gâteau

J'essaie d'adopter le motif de gâteau, mais j'ai des difficultés à adapter à ces styles de programmation, en particulier lorsque des tests unitaires sont concernés.

suppose que j'ai les objets métier suivants: < Pré> xxx

Maintenant, j'aimerais tester PetStore tout en se moquant des fonctions de vétérinaire. Si j'utilisais de la composition, je créais un maquette [Vet] et le transmettais au constructeur de PetStore, puis de programmer la maquette comme nous le faisons dans le monde de Java. Cependant, je ne trouve aucune référence à la manière dont les gens le font avec le motif de gâteau.

Une solution possible serait d'implémenter le vaccin () sur chaque cas de test selon l'utilisation attendue, mais cela ne 't Permettez-moi de vérifier que les simulacres ont été appelés correctement, ne me permettent pas d'utiliser des correspondants, etc.

SO - Comment les gens utilisent-ils des objets de gâteau avec des objets mock?


0 commentaires

4 Réponses :


4
votes

C'est une bonne question. Nous sommes arrivés à la conclusion que cela ne peut pas être fait, du moins pas tout à fait la même chose que nous sommes habitués. Il est possible d'utiliser des talons au lieu de se moquer de moquer et de mélanger les talons dans les gâteaux. Mais c'est plus de travail que d'utiliser des moqueurs.

Nous avons deux équipes Scala et une équipe ont adopté le modèle de gâteau, en utilisant des talons au lieu de simulacres, tandis que l'autre équipe bloquée sur des classes et une injection de dépendance. Maintenant, j'ai essayé les deux, je préfère di avec des simulacres en raison d'elle être plus simple à tester. Et sans doute plus simple à lire aussi.


2 commentaires

C'était initialement ma pensée. Cependant, alors que j'ai commencé à travailler de plus en plus avec Scala, je suis arrivé à la scène où je séparais différentes préoccupations des mêmes objets commerciaux conceptuels à des traits différents pour la qualification et la clarté. L'utilisation de DI ici entraînera un graphique d'objet excessivement important et un code d'initialisation d'applications lourds.


Ymmv comme on dit. Notre expérience était le contraire.



6
votes

J'ai commencé à utiliser le motif de gâteau après avoir lu ce blog post: https://github.com/proCog/staticsite/blob/master/contents/blog/existiential-types-ftw/index.md L'approche est différente de la plupart des poteaux de motifs de gâteau dans Ces types existentiels sont utilisés au lieu d'auto-types.

J'ai utilisé ce modèle pendant quelques mois et il semble de bien fonctionner car je peux spécifier une simulation lorsque je le souhaite. Il a plus d'injection de dépendance, mais il a tous les avantages que vous obtenez de votre code dans des traits. P>

Ma version bâtaillée de votre problème à l'aide de types existentiels serait quelque chose comme ceci: xxx pré>

Vous pouvez tout mettre ensemble dans votre application p> xxx pré>

et vous pouvez tester les composants individuellement en créant une instance de Vételasque et créant également une simule de vétérinaire d'utiliser votre test de PetStore. P>

//Test VetLike Behavior
scala> val vet = new Vet{}
scala> vet.vaccinate(new Pet("Fido"))
Vaccinate:Pet(Fido)


//Test Petstore Behavior

class VetMock extends Vet {
   override def vaccinate(pet: Pet) = println("MOCKED")
}

class PetStoreTest extends PetStore with PetStoreConfig {
   type Config = PetStoreTest
   def config = this

   val vet = new VetMock
   val fido = new Pet("Fido")
   sell(fido)
}

scala> new PetStoreTest
MOCKED


2 commentaires

C'est cool - mais je manque quelque chose? Que faites-vous avec le type de vétérinaire dans PetStore?


J'ai donc essayé de donner un exemple sans utiliser le trait ConfigComponent, mais je faisais quelque chose de mal. Quoi qu'il en soit, j'ai mis à jour cet exemple et ajouté configommonent. Espérons que les choses se voient un peu plus claires.



2
votes

J'ai trouvé un moyen d'utiliser Scalamock avec ScalAtest à des fins des modules de test de «motif de gâteau».

Au début, j'ai eu de nombreux problèmes (y compris Ceci One), mais je crois que la solution que je présente ci-dessous est acceptable. Si vous avez des préoccupations, s'il vous plaît laissez-moi savoir. P>

C'est comme ça que je voudrais concevoir votre exemple: p> xxx pré>

Les tests sont ensuite définis comme suit: P>

val someOtherPetStoreImpl = new PetstoreBehavior with PetStoreModuleOtherImpl


0 commentaires