Transcription
1. Introduction: Bienvenue sur le développement piloté par les tests dans dotnet Core, le manuel. Je suis votre instructeur de voyage ou Williams et je suis ingénieur logiciel et littérature depuis plus d'une décennie. Maintenant, vous êtes probablement curieux d'avoir vu le titre du cours et vous vous
demandez ce qu'est exactement le développement piloté par les tests ? Eh bien, le développement piloté par les tests est un processus de développement logiciel qui repose
sur les exigences écrites en tant que cas de test avant l'écriture du code réel. Donc c'est vrai, tu l'as bien lu ? On fait les tests unitaires. D' abord. Je sais que le test de mot est ce qui vous a conduit à ce cours. Et vous regardez le test de mot, je me demande, ok, je sais un peu ce que sont les tests unitaires, mais je ne suis pas nécessairement sûr de savoir comment je peux les utiliser dans mon code. Eh bien, c'est le cours parfait pour vous. Donc, TDD est un processus de s'assurer que nous écrivons du code testable et il est assez modulaire et il suffit simplement de faire la tâche. C' est également un processus qui garantit que nous avons une couverture maximale de code. Donc, lorsque nous faisons des changements de rupture et plus tard dans le code, il n'y aura pas nécessairement de rupture, mais ils s'intègreront parfaitement. Nous avons maintenant ce que nous appelons le cycle de développement piloté par les tests. Dans ce cycle, nous faisons notre test rouge, qui signifie que nous écrivons le test unitaire. n'y a pas de code, pas de code de support, mais comme nous modélisons sur le test, nous devons créer tous les artefacts qui seraient nécessaires dans le code réel de toute façon. Cela nous aide donc avec notre API initiale ou les concepts de conception de code initial. Ensuite, nous écrivons le code trop les tests que nous avons écrits. Donc, nous avons écrit un test pour correspondre à l'exigence nulle part écrire le code pour correspondre au test. Et puis le résultat final de cela serait que nous écrivions le code pour correspondre au test et nous testons à nouveau et obtenons un test vert. Donc, le test rouge signifie qu'il échoue. n'y a pas de code pour supporter ce test. Nous écrivons le code, puis nous testons à nouveau, et ce test devrait maintenant passer. Cela signifie donc que le code que nous avons écrit va maintenant
remplir l'exigence pour laquelle le test a été écrit. Alors que nous le faisons et que les exigences grandissent ou notre compréhension de ce qui doit être mis en œuvre s'améliore. Nous refactorisons et répétons ce processus. Maintenant, de nombreux développeurs tests unitaires Nobel, mais pas beaucoup de développeurs pratiquent réellement. Religieux, ils sont pratiqués dans la mesure où ils en ont besoin. 1, il vous dit d'écrire du code testable. Vous allez toujours être capable d'écrire votre code d'
une manière que je puisse en tester différents aspects
sans avoir à vous soucier d' initialiser ou de se moquer de trop de choses à la fois. Mais toutes les choses sont injectables. Cela aide donc à appliquer ce que nous appelons les principes solides dès le départ. Cela conduit généralement à un code beaucoup plus propre et succinct et implique généralement que vous mettez des pratiques appropriées lors de l'écriture de votre code. En outre, vous obtenez des commentaires presque instantanés sur si votre code fonctionne ou non parce que vous allez juste faire des tests automatisés contre un cas de test. Donc, vous créez un scénario où votre test devrait passer, probablement un où si les données étaient, mais il devrait le faire. Il vous suffit de créer vos scénarios et d'obtenir des commentaires instantanés. Les citoyens doivent attendre combien de temps avant qu'une demande ne s'enclenche. Et puis vous mettez les valeurs et puis vous voyez les commentaires. Vous pouvez automatiser ces choses et cela
réduira considérablement le temps que vous passez à tester et à tester le code. Maintenant, avec tout ce qui dit, il y a des inconvénients et certains d'entre eux incluent le fait que cela prend du temps parce que vous écrivez
réellement deux fois plus de code que vous l'
auriez probablement si vous écriviez simplement le code dès le début. Il peut aussi être difficile pour les débutants d'obtenir le début, mais c'est pourquoi nous sommes tous ici en ce moment ce cours est très convivial pour les débutants. Vous apprenez à utiliser l'unité ECC pour faire tenir des projets de tests pour utiliser des bibliothèques tierces pour rendre les tests et les assertions beaucoup plus faciles. Nous examinerons comment nous faisons tout le cycle d'essai. Donc, nous allons écrire des tests puis implémenter le code, et puis nous sommes facteur à mesure que l'application grandit et nous regardons juste le développement piloté par les tests et jetons ce cours, nous allons examiner certains des pièges, mais finalement nous voulons pour simplement augmenter vos compétences de test unitaire et vous aider à comprendre pourquoi c'est important et comment cela peut être fait avec un maximum d'efficacité. Maintenant, un aperçu rapide de ce que nous allons faire. Premièrement, nous allons construire une véritable application. Ce ne sera pas l'application la plus compliquée, mais ce sera juste assez pour que nous puissions voir comment les différents niveaux de tests unitaires peuvent fonctionner, comment il évolue au fil du temps, et certains des niveaux de base ou de haut niveau exigences artefact, celui-là, C'est une demande de réservation de chambre. Je dois donc mettre en logique pour gouverner. Toute la salle est réservée, ce qui est demandé, quel genre de commentaires l'application va donner. Et nous finirons par être connectés à une base de données. Nous devons donc nous assurer que toutes ces connexions fonctionnent. Donc, je vous dis qu'à la fin de ce cours, nous aurions construit quelque chose de proche de ce à quoi ressemblerait
notre véritable application d'entreprise. Et nous l'aurions fait en utilisant un développement piloté par les tests. Donc, avec tout ce qui a été dit et fait, c'est un développement piloté par des tests avec dotnet Core, le manuel. Et j'ai hâte de te voir dans le cours.
2. Créer un projet d'essai: Alors continuons dans ce cours et nous allons commencer par mettre en place des projets d'artistes. Donc, si vous n'avez pas déjà Visual Studio, il peut aller de l'avant et obtenir 2019 sont la dernière version disponible pour vous au moment de cet enregistrement. Mais ce que nous allons faire, c'est d'aller de l'avant et de créer un nouveau projet. Et nous voulons un x projets de test unitaire ou juste il est une recherche de x unités. Maintenant, il suffit de noter que oui, nous utilisons x unité pour ce cours. Mais les principes généraux du test unitaire peuvent être appliqués à un projet d'unité finale ou même à un projet de test Microsoft régulier. Parce que si vous tapez juste test ou un projet de test, je suis sûr que vous verrez MSTest. On y va. Et le projet de test unitaire ainsi que les projets de tests unitaires X. Donc, je vais vous montrer en utilisant des unités x, mais les principes généraux du test unitaire resteront vrais. Allons-y et frappons les unités H. Et nous allons appeler cette salle de projet en réservant dot core, dot. Donc chambre gonflant nom de l'application. Le noyau sera là où nous aurons toute la logique métier. Donc je l'appelle juste point core, mais ensuite nous allons écrire des tests unitaires autour du projet de base. Pour le nom de la solution. On va renommer ça. Donc je vais juste dire réserver une chambre, c'est une solution, mais en ce moment nous avons juste affaire à un projet d'essai. Alors encore une fois, allez-y et créez ces, appuyez sur Suivant. Et oui, nous utilisons dotnet cinq fois de cet enregistrement. S' il y a une petite version et n'hésitez pas à l'utiliser, ce qui serait probablement fait à six heures. Et puis nous allons de l'avant et appuyez sur Créer. Donc, le résultat final de cette activité est notre obtention de ce nouveau test de points de base de réservation de salle de projet. Nous obtenons également ce fichier par défaut appelé unittest one. Maintenant, je suis tout dans l'écriture d'un test unitaire dans cette vidéo en particulier, mais nous allons parcourir certaines configurations que la chose va juste faciliter pour nous aller de l'avant. Je vais également examiner les bases de ce qu'est un test unitaire. Donc, la première chose que je vais faire est de faire un clic droit sur notre fichier de projet pour le projet de test et aller dans Propriétés. Et ce que je vais faire est de changer l'espace de noms par défaut. Parfois, ma surface glitchy Visual Studio du commutateur 15 onglets. Mais nous allons changer l'espace de noms par défaut en Booking dot core, quelqu'un pour supprimer cela parce que ce qui se passe est qu'il facilite
réellement le partage des ressources entre les projets, le projet de test et le noyau de points réel quand il arrive en ligne. Et s'ils ont le même espace de noms, il est facile de partager les ressources qui devront
certainement être partagées entre les deux. Donc je m'assure juste que tout
va bien avec ça et ensuite je peux sauver et fermer ça. Maintenant, j'ai dit des configurations, mais c'est vraiment la seule dont nous avons besoin au moins, non ? Non. Donc, en termes de base d'un test unitaire, vous remarquez que l'un, nous avons cette annotation au-dessus de la méthode appelée graisse. Maintenant, c'est ce qui dit à l'IDE, le programme tout ce qu'il s'agit juste d'un test unitaire, facteur cela dans l'ensemble du temps d'exécution de l'application. C' est un test unitaire. Donc, chaque fois que nous écrivons des tests unitaires, nous voudrons au moins avoir cette annotation qui dit gros. Et une autre annotation que nous allons examiner est la théorie. Mais nous finirons par y arriver. C' est donc l'étape numéro un. La prochaine chose à noter est qu'un test unitaire comporte généralement trois étapes. Vous avez l'orange, nous avons le cœur, et ensuite nous avons affirmé. Donc, d'une manière générale, les Iranges où vous préparez toutes les données, vous préparez vos artefacts de test. Vous savez, chaque fois que vous allez tester quelque chose en utilisant une interface utilisateur, connaissez
généralement une valeur que vous devez mettre pour obtenir quel type de réponse pour quel que soit le résultat que vous testez. Donc, c'est ce qu'ils sont disposés partie est avant quand créer des objets sont des représentations de toutes les données que nous nous attendons à tester contre. C' est ce que nous faisons, nous les créons. Ensuite, nous allons optimiser n'importe où quand simuler réellement un appel à la méthode que nous espérons devrait être appelée lorsque nous adoptons une telle action, alors nos assertions null seraient ce que voir si le test va passer ou échouer. Parce que alors nous devrons affirmer que c'est l'ancienne colonne avec cette entrée de cette méthode. Ou est-ce arrivé ? Est-ce que ça n'est pas arrivé ? Donc, si nous disions que cela devait se produire et que cela ne s'est pas produit, ce test se sentira fondamentalement. Et puis c'est là que nous devrons soit écrire le code
pour le rendre vert, soit il aurait l'impression que c'est le rôle de la cour et a exécuté le test. Cela signifie qu'il y a probablement quelque chose de mal avec le code ou quelque chose de mal en cours de route. Donc, c'est essentiellement comme ça qu'un test unitaire fonctionne. C' est juste la théorie. Et je ne suis pas en train d'essayer de le garder aussi simple que possible pour que vous ne pensiez pas que c'est trop difficile ou trop difficile de conceptualiser comment cette chose fonctionnera. Eh bien, Visual Studio rend très facile de naviguer dans tests car ils nous donnent un Explorateur de tests. Et vous pouvez accéder à ce texte Explorateur de test en allant View, puis en cliquant sur Test Explorer ou en faisant Control E et T. Donc, cet explorateur de test va essentiellement être une interface qui nous montre tous les tests unitaires qui sont en attente tous les tests, les projets un, tous les tests unitaires à la place des projets AC nous avons test unitaire 1, c'est notre classe I là-dedans, nous avons test1, non ? Et puis cela nous permettrait de faire ces tests. Maintenant, j'ai juste cliqué sur Exécuter, mais rien ne se passe parce qu'il n'y a rien à courir. Donc, essentiellement chaque fois que nous écrivons des tests unitaires appartiennent à une méthode particulière, vous verrez réellement les propriétés
de navigation à l'intérieur de Visual Studio pour montrer quelle méthode a combien de tests, combien de tests échouent ou passer des idées, cette méthode unique, et cetera. Un autre avantage de grille des tests unitaires dans votre devis est que vous pouvez configurer ce que nous
appelons des builds fermés dans certains pipelines DevOps. Donc, les pipelines DevOps lorsque vous vouliez un développement
continu, une intégration continue, vous travaillez sur une équipe, différentes personnes ont triché dans différentes parties du code. Vous voulez vous assurer que lorsque quelqu'un vérifie son code que tous les tests unitaires qui utilisent le travail fonctionnent toujours. Et tous les nouveaux, ils ont introduit notre politique, désolé qu'ils passent pas travail. Comment les biologistes disent que je voulais m'assurer que tous les tests passent avant autoriser ce nouveau code dans un référentiel central pour toute l'équipe. Donc, les tests unitaires peuvent agir comme un gardien contre cela. Donc, avec tout ce qui a dit et fait, encore une fois, juste un peu de théorie, juste un peu de compréhension sur la raison pour laquelle nous écririons des tests unitaires. Et quand nous reviendrons, nous allons lire notre premier test pour notre première exigence.
3. Test, unité : Créer un test d'unité en fonction des besoins: D' accord les gars, alors allons de l'avant et créons notre tout premier test unitaire. Notre première exigence est que lorsqu'une méthode particulière est appelée pour traiter la réservation, nous nous attendons à un certain type de résultats avec tous les détails de réservation inclus. C' est donc notre première exigence que nous allons répondre. Maintenant, bien sûr, comme nous obtenons une meilleure compréhension des autres exigences sont citation, blocs
unquote va évoluer. Donc je le fais juste dans une minute. Blocs pour que nous puissions voir comment le code évolue, comment nous refactoriser la salle, nous retestons et tout ce que nous répétons, et fondamentalement comment le cycle fonctionne. Donc avec tout ce qui a dit et fait assez de mon monologue, commençons. Donc, je vais supprimer le test unitaire que nous
voyons actuellement et nous allons créer une nouvelle classe. Et je suis allé appeler ce test de processeur de demande de réservation d'une chambre pour descriptif, ou il n'y a rien de mal à être descriptif avec leurs noms de classe. Quiconque regarde votre classe devrait savoir ce qui se passe. C' est donc un test pour nos demandes de réservation de chambre, le processeur que nous avons l'intention de construire à terme. Donc je vais aller de l'avant et ajouter ça, rencontrer le public de classe. Et à l'intérieur de ça, je vais avoir le vide public. Devrait retourner chambre réservation une demande. Et c'est une méthode, bien sûr, non, je voulais faire une pause ici et 0 qu'il y a différentes conventions lors de nommer à certaines personnes, ils utilisent les traits de soulignement. Certains DB2 n'utilisent pas de traits de soulignement. Ils préfèrent avoir tout CamelCase ou Pascal cas plutôt. Il y a donc différentes conventions. Un peu d'Ebola, n'est-ce pas ? Un à passer, un à échouer, et vous avez différentes façons de l'aborder. Donc je fais juste remarquer, je vais essayer d'utiliser les traits de soulignement pour ce qu'il fait. J' ai aimé les soulignements dans l'ensemble de tests ou vraiment que les utiliser partout ailleurs. J' aime les utiliser lors de l'attribution de noms à mes méthodes de test. Vous ne pourriez pas, mais le fait est que vous faites tout ce est à l'aise avec vous tant que votre code est lisible. D' accord ? Donc, à l'intérieur de ce test, et une fois de plus c'est un test donc nous devons nous assurer que nous lui donnons nos attributs, qui est le point de contrôle Fox, pour inclure l'espace de noms manquant pour l'unité x. On y va. Donc, cela pourrait être autre chose, cette annotation pourrait être autre chose si vous utilisez un projet de test différent. Mais encore une fois, je me concentre sur les unités x dans ce cours. Maintenant, ce que nous allons faire est le Shawn orange de toutes ces menaces de test, qui est de créer nos artefacts de test. J' ai donc besoin d'une instance du processeur réel que nous devons tester. Donc, je vais créer un processeur de réservation de chambre var, ou je l'appellerais juste processeur, est égal à une nouvelle instance de quelque chose qui n'existe pas encore. D' accord ? Alors, comment le faire exister ? Eh bien, je vais juste faire des points de contrôle. Je ne veux pas dire qu'il génère la classe dans un nouveau fichier, donc c'est tout. Allez-y et créez cela pour qu'il soit nul dans l'existence. Vous pouvez aller de l'avant et le remplir avec toutes les propriétés dont nous savons qu'il va avoir besoin sont les méthodes dont il va avoir besoin. Eh bien, avant que je ne le fasse, ce que je vais faire, c'est de l'RE dans un péché et de la diarrhée et de la phase Jean. Alors pourquoi les exigences sont envisageables ? Je sais que c'est une requête doit venir et deux, j'ai besoin de retourner quelque chose avec les mêmes valeurs de la requête qui vient d'entrer. C' est le processeur qui va gérer la demande et faire toute la logique métier. Mais en fin de compte, je sais que dans mon arrangement j'ai besoin de Mach à quoi ressembleront nos demandes. Donc, je vais juste dire que la demande de réservation var est égale à une nouvelle instance off et je vais juste utiliser la demande de réservation de chambre. Et cela va avoir quelques propriétés. Donc, peu importe le fait que ces choses n'existent pas. C' est un point de développement piloté par les tests. Modéliser quoi ? Donc je sais que l'application va devoir accomplir certaines tâches, non ? Donc, la demande de réservation est égale à la demande de réservation de nouvelle chambre. Et cela va avoir ou le nom complet des champs. Et je peux juste mettre le nom du test. Donc, une fois de plus, ce sont des fichiers de test, c'est qu'ils n'ont pas nécessairement à se rendre compte de ce dont ils ont besoin pour être vraiment assez pour représenter ce qui pourrait arriver. Donc, testez request.com. Et puis nous avons la date, ce que je peux dire est égal à mettre toute nouvelle date, heure où nous passons dans l'année, le mois et le jour. C' est donc à quoi cela ressemblera. Cet objet est l'objet de demande de réservation. Donc, après avoir fait tout cela, je peux savoir dire control dot legit, non, il devrait créer un nouveau fichier et regarder notre Visual Studio si intelligemment il dit générer la classe avec ces propriétés et je vais dire pourquoi. Merci. J' aimerais beaucoup que vous le fassiez. Et je peux juste sauter et m'assurer que tout va bien avec ça. Et ça me semble bien. Je vais retourner à mon test et aux continents. J' ai donc la classe de processeur créée, j'ai la requête croisée créée. Non, j'ai besoin d'une méthode qui traiterait réellement la demande. C' est vrai, mais mettons ça à l'intérieur des processeurs. Donc, je vais mettre que le processeur va avoir une méthode, bien
sûr non existe. Mais ça va s'appeler la salle de livre, qui prendra la demande. D' accord, donc j'appelle mes méthodes est R. C'est ce que j'ai l'intention d'appeler les méthodes. Bien sûr, j'aurais pu appeler ce processus demandes ou autre chose, mais je suis juste en train de tracer ce sera marié. Il prend dans notre objet de requête. Et nous sommes supposés revenir, non ? On devrait revenir. Donc, cela a renvoyé les demandes de chambre, les demandes de réservation de chambre. Donc, je vais dire ou devrait retourner la réponse de réservation de chambre. Et je vais juste dire quelles sont les valeurs avec les valeurs des requêtes. Je pense que c'est assez clair, Fred. Donc, quiconque lit cela saura que c'est ce que la méthode teste. Donc, cela signifie que j'ai besoin de réservation de chambre, classe de
résultats sur d'autres appelés les résultats des objets. Et dites que c'est égal à n'importe quelle salle de livre reviendrait. qui veut dire que la salle de livre est censée retourner quelque chose de ce type, qui n'existe pas. Bien sûr, une fois de plus, je vais juste contrôler les points et générer ce type dans sa propre classe. D' accord, donc c'est fait. Une autre chose à noter, c'est que nous n'avons pas encore cette méthode. Donc, cet ensemble de demandes qui était une faute de frappe de ma part. Donc, cela aurait dû être la demande de réservation et null réservation notre chambre de réservation. Je suis allé contrôler le point et l'ai fait générer cette méthode. Non, il peut déduire quel type de données le paramètre doit être parce que toutes les erreurs que nous utilisons. Donc, je m'excuse d'utiliser la mauvaise variable là. Il aurait dû réserver des demandes. Ce ne sont pas seulement une demande. Et qui est ceci est notre méthode générative. Cela semble bien, mais il n'est bien sûr pas mis en œuvre. Alors passons en revue ce que nous avons fait jusqu'à présent. Tout cela pourrait être considéré comme la plage. Donc, nous avons arrangé des échantillons de données. Nous sommes disposés un objet hors de ce que nous devons tester. Ensuite, voici où nous appelons réellement la méthode et essayons d'obtenir les résultats. Donc, cela signifie que cela s'appelle le OK. D' accord. Nous avons donc arrangé alors nous avons agi non. Nous devons affirmer que nous devons donc nous assurer que nos hypothèses sont ce que nous attendons à arriver est correct. Et bien qu'il y ait intégré, il y a un mot-clé intégré pour les assertions dans dépassé appelé assert, non ? Mais puis il y a d'autres bibliothèques et j'ai vu, je vous montrerais un appelé peu de temps afin que vous puissiez cliquer avec le bouton droit de la souris, sauter sur vous obtenir des paquets. Et si vous recherchez astucieusement, ce serait en haut de la liste où il utilise type d'assertion couramment type d'outil de style, comment vous pouvez écrire votre code. Donc, j'aime vraiment l'utiliser est soit juste aller de l'avant et l'installer. Bien sûr, accepter les termes et conditions. Et une fois que c'est fait, on pourra revenir à notre code. Donc, je voulais vous montrer les deux dit la syntaxe, mais vous pouvez prendre votre propre décision quant à savoir s'ils aimaient la bibliothèque ou non. Désolé, vous voulez utiliser la valeur par défaut, c'est très bien. Pour que je puisse dire affirmer des points. Et à ce stade, il devrait retourner la réponse avec des valeurs. Donc ça veut dire que je suis le plus obtenir MC, une réponse ou notre résultat, n'est-ce pas ? Donc, je peux voir pas nul. J' affirme que quel que soit l'objet que je veux ici n'est pas nul. Dans ce cas, je veux affirmer que le résultat n'est pas nul. Si j'utilisais un peu de temps, je pourrais dire point de résultat, mais alors je devrais ajouter une instruction using pour la astucieuse. Donc, il suffit de voir l'utilisation devrait lien. Donc, je peux regarder l'objet sur lequel je voudrais mettre l'assertion et voir les résultats point. Et je peux voir devrait et regarder toutes les méthodes que vous obtenez, d'accord. Donc, il devrait être nul ou ne devrait pas être nul. Très bien, c'est, je vois que ça ne devrait pas être nul. Cela me permet également de mettre des messages personnalisés de sorte que lorsque je regarde Hold the test run, je peux voir exactement ce qui a échoué en fonction du message que je mets. Donc c'est plutôt cool. Je l'aime et c'est flexible. Quoi qu'il en soit. Je ne vais pas vous ennuyer avec les détails techniques de l'affirmation par rapport à la bibliothèque devrait. Je veux juste passer à travers l'activité correctement. Donc, à ce stade, nous pouvons affirmer que cela ne devrait pas être annulé, voulu obtenir granulaire. Et à la fin de la journée ou les assertions sont essentiellement basées sur la base que vous voulez convertir pour vous assurer que le code que vous testez est effectivement correctement testé. Donc, les assertions annuelles peuvent être différentes de la liste d'assertions de
quelqu'un d'autre basée sur ce qu'ils pensent être important. Mais en fin de compte, j'espère que tout le monde pourra s'entendre sur ce qui, à tout le moins, devrait être affirmé ou couvert sur la base du critère. Pour qu'on puisse avoir des granulomes. Ce Ceux voient avec les valeurs de requête, n'est-ce pas ? Donc, le nom du test explique exactement ce qui devrait arriver. Premièrement, la réponse ne doit pas être nulle, d'accord, donc il ne devrait pas supporter la réponse et deux, là avec les valeurs de requête. Donc, cela signifie que tout ce qui est dans le résultat devrait aussi être ce qui est dans la réponse. Donc, je peux affirmer point et je peux dire égal à la requête. Et puis sod ce point, les réservations ou garder un scénario quêtes les demandes de réservation. Je pense que je devrais simplement renommer ceci pour demander. Eh bien, la demande de réservation. Laisse-moi juste faire ce truc en faisant l'erreur. Donc, demandez ce contrôle points et peu, renommez-les tous. On y va. Donc, demandez des points, nom complet. Et puis on peut dire des résultats. Le résultat Hotspot n'a pas de champs
car il doit également avoir les frais de CAM que la demande a. droite. Donc, à ce stade, refactor et moi avons fait en sorte que leurs résultats sur leur quête. J' aime, non, ne me dérange pas le fait que je répète ces champs tout de suite. Nous allons refactoriser et c'est pourquoi vous avez le refactoring. À ce stade. Je veux juste passer le test, m'
assurer que tout va bien. D' accord. Donc, je veux affirmer que le nom complet dans la requête est égal au nom complet dans les résultats. Et je peux le faire pour les autres champs. Il suffit de dupliquer cette ligne avec le contrôle D et C, e-mail doit être le même que l'e-mail et il doit être le même que si vous utilisiez sûrement. Et je vais juste réorganiser le code ici, alors vous diriez quelque chose comme les résultats point et puis le champ, qui devrait être le nom complet, devrait l'être. Donc ça devrait l'être. On y va. Et puis à l'intérieur de cela, vous mettez dans quel que soit le résultat attendu est ou le résultat devrait être le même que la réflexion de la demande. Et c'est fondamentalement tout. Donc deux syntaxes différentes, deux façons différentes. Et à la fin de la journée, il y a d'autres bibliothèques que vous pouvez utiliser pour avoir probablement des assertions plus lisibles ou plus confortables. Mais c'est à vous de décider. Je vous montre juste vos options. J' aime, comme je l'ai dit, c'est juste ma préférence que j'aime ensemble. La syntaxe circule lorsque j'utilise les assertions de devis, non ? Donc pour moi, je peux juste dupliquer et ensuite je ferai la même chose. e-mail de point de résultat devrait être le point de requête e-mail et le point de requête d. Il devrait être cela. Alors prenez votre choix, celui que vous préférez. Maintenant, si je regarde tout cela après une construction, je vois qu'il a réussi. Donc, je n'ai aucune erreur de syntaxe ou quoi que ce soit. Et je sais que le test ACT avec la classe réelle n'est pas encore implémenté, non ? Donc non, je peux faire le test. Je peux cliquer sur ce petit indicateur ici et je peux cliquer sur Exécuter. Donc, je peux le faire à partir d'ici, ou je pourrais lancer mon Explorateur de test pour exécuter le test à partir de là. Eh bien, c'est soit juste cliquez sur Exécuter, qui va initialement lancé des statistiques pour. Et nous voyons ici que nous avons un test échoué. Donc, lisez les tests en raison de l'exception System.Out pas implémenté. Donc, en d'autres termes, il essaie d'appeler la méthode, mais elle n'est pas implémentée. Pourquoi cette exception est-elle accordée ? C' est parce que si nous passons à la méthode et je viens d'utiliser si 12 pour sauter par-dessus, alors nous voyons ici que le, il a un test associé et il ne
passe pas et à travers l'exception non implémentée. D' accord, donc quand nous
reviendrons, nous allons écrire le code ici que lorsque nous exécutons le test, nous devrions aller au moins jusqu'aux assertions et ensuite nous pouvons voir à quoi elles ressemblent.
4. Mise en œuvre : Écriture du code pour retourner des données correctes: Hey les gars, la dernière fois qu'on était ici, on écrivait nos tests et nul, on reviendra vers moi à ce test de racine, avidité. Donc, juste comme un résumé, nous écrivons un test qui devrait retourner la réponse de réservation de salle avec le corps de la demande est C'est ce que le scénario des artistes est. Et nous avons arrangé quelques mauvaises demandes, qui comprend les champs email, nom complet, et les demandes D, nous avons notre processeur qui n'est pas encore implémenté, ou nous avons le fichier, mais la salle de livre de méthode n'est pas encore mis en œuvre, mais nous avons certaines affirmations que nous avons vu sentir lorsque nous exécutons ce test. Nous avons également examiné les deux façons de faire des affirmations. Celui-ci est la façon naturelle qui sort de la boîte dans les unités. Et j'ai introduit une nouvelle bibliothèque appelée sous peu, qui amène jusqu'à ce que le genre d'affirmation courant à elle. Vous avez aussi d'autres bibliothèques d'assertions comme des assertions fluides, et il y en a d'autres, mais comme je l'ai dit, vous en choisissez une et vous vous y tenez si vous vous sentez à l'aise avec elle. Pas de problème. Donc, ce que nous sommes ici pour faire est de mettre en œuvre notre méthode de salle de livres. Maintenant, le test, juste, aucune exigence pour laquelle nous voulons écrire du code est de nous assurer que
tout ce qui est retourné en conséquence a toutes les valeurs qui étaient dans les requêtes. Ce qui nous fait avoir une implémentation simple vraiment. Donc, tout ce que nous avons vraiment à faire est de retourner une nouvelle instance du résultat de réservation de chambre où ses champs, nom
complet serait égal à la demande, point le champ ou les demandes de réservation ou autre point le champ avec le même nom. Et maintenant ces doublons et ensuite faire la même chose pour date et la même chose pour le courrier électronique, il y avait faible. Donc, à la fin de cela, tout ce que nous avons vraiment besoin de voir, c'est qu'il retourne un objet qui répond à nos affirmations. Très bien, donc avec ça fait, faisons notre test à nouveau. Et voilà, nous avons maintenant un test vert. Donc vous verrez ici qu'il indique qu'un test sur un passe. Donc nos affirmations de test ne fonctionnent pas. Donc, si je devais commenter toutes ces assertions et relancer le test, vous verriez que cela fonctionne très bien. Donc, que vous affirmiez la lumière ou que vous utilisiez sous peu ce style, ils fonctionneront de la même manière. Donc, c'est vraiment tout ce qu'il y a à implémenter
le code à ce stade, au moins pour avoir notre test, BI test vert. Donc une fois une pause ici, et quand nous reviendrons, nous refactoriserons le code comme notre aperçu, pourquoi nous devons revenir et en refactoriser un. Vous avez vu que nous avons des demandes, alors nous avons des résultats. Les deux sont un peu identiques, non ? C' est un outil. Nous avons le processeur assis dans le même projet de test que le test. Aucune de ces ressources, qui sont les ressources réelles pour l'application, ne devrait vraiment être à l'intérieur du projet de test. Donc, nous allons revenir et nous allons refactoriser notre projet et éloigner ce qui doit être déplacé cependant, si corrigez toutes les références et corrigez le code afin qu'il y ait moins de répétition tout autour.
5. Refactor : Code de test et de mise en œuvre: Bienvenue de retour. Allons nous refactoriser. Alors rappelez-vous que le cycle est que nous écrivons le test, il est rouge. Nous écrivons le code pour moi, le degré de test dans, et puis nous refactorisons si nous en avons besoin, car parfois entre les deux activités, nous pouvons répéter code ou mettre des fichiers de travail où il ne devrait pas nécessairement être nul. On va réorganiser un projet à transporter. Nous savons que c'est censé regarder et comment il doit regarder à l'avenir. Bon, donc ce que je vais faire est de créer une autre bibliothèque de classes. Donc, nous allons juste ajouter un nouveau projet. Ça va être une bibliothèque de classe. Et j'ai le mien sur le côté ou sur le côté, mais nous avons affaire à des bibliothèques de classe C-Sharp. Et je vais juste nommer cette chambre réservant dot core. Donc, ce sont des tests de base de points, résumant la bibliothèque de noyau de points maintenant. Ensuite, laissez ce dotnet cinq. Et quand cela est créé, nous pouvons aller de l'avant et supprimer le fichier de classe un par défaut. Ensuite, après cela,
ce que nous allons faire est de prendre toute la fosse dont nous avons besoin, et je vais juste les couper et les coller à l'intérieur de notre projet de base. Alors rappelez-vous que depuis le début,
nous avions dit que l'espace de noms pour les doctests de base, l'espace de noms par défaut que nous avions dit être core. Eh bien, c'est pour ça que regarde ça. C' est comme un plug and play. Tout s'est passé de façon transparente. Donc, si nous regardons les fichiers de code verront qu'ils
s'intègrent bien avec les espaces de noms tels qu'ils ont été créés. D' accord, cependant, vous remarquerez que nous avons un tas de lignes rouges dans le test. C' est comme si elle ne pouvait plus les voir, non ? Et pour des raisons compréhensibles. Donc, le problème ici est qu'ils ont actuellement le flux interne et les moyens internes que l'espace de noms, tout ce qui se trouve dans le même néon CSR dans le même assemblage peut plutôt voir ce que rien d'autre ne peut. C' est pourquoi je suis allé les rencontrer publics parce que, en dehors des tests, nous aurons besoin d'accéder à leur externe, donc je vais les rendre publics. Et quand nous reviendrons à notre test, nous verrons que nous avons encore un problème et c'est parce que nous avons besoin d'une bibliothèque pour. Et donc je fais un clic droit sur les dépendances et les références du projet de test et du projet. Et puis nous allons juste ajouter ce clic sur la bibliothèque de classe, Ok. Et puis tout va bien. On y va. Maintenant, cela veut dire qu'il ne peut pas voir cette méthode en raison de son niveau de protection. Une fois de plus, ce serait parce que c'est interne. Donc cela signifiait que c'était public. Et puis tout le monde peut voir tout le monde et tout le monde est heureux. Maintenant, nous pouvons descendre une autre racine de séparer tout sont affiner la mise en page de notre projet. Donc, la séparation des préoccupations ne consiste pas seulement à créer des fichiers de classe individuels, mais aussi à s'assurer que les classes sont les actifs qui sont liés les uns aux autres, sont situés dans un emplacement central. Donc oui, tout réservation de chambre, ce n'est pas l'artiste est dans le même projet. Mais alors nous avons ce que je pourrais appeler des modèles, nos modèles de domaine ici, séparés du Huan réel avec le mythe et effectuant un processus, quelqu'un pour créer un peu plus de séparation ici. Et je voulais appeler celui-ci des processeurs, des
processeurs chez les enfants qui ont plus de processeurs et le trône les a mis là. Et dans cela veulent aussi ajouter un domaine. Ou nous pourrions appeler ce modèle, alors nous l'appelons modèles au lieu de domaine. D' accord, et ensuite je vais passer à des mannequins. Et je suis allé déplacer le processeur dans le dossier des processus. Sachez que la conséquence est que nous devons changer l'espace de noms. Donc, je vais souvent appeler ce modèle de pensée et faire la même chose ici. Et puis pour le processeur, je vais devoir appeler celui-là les processeurs Box. On y va. Alors tout voit, il peut trouver la référence. Donc c'est parce que vous devez vous assurer que nous avons la nouvelle utilisation. Donc, je vais juste copier cette déclaration en utilisant, sauter à notre test. Et je vais juste ajouter que l'utilisation de Steven en fait un pour les processeurs. Bon, maintenant tout le monde peut voir tout le monde. Donc, si nous en faisons une de plus juste pour nous assurer, alors les builds sont réussies et laissez-moi juste exécuter nos tests une fois de plus. Je vais juste faire un clic droit et dire Exécuter un test. Et les tests réussissent toujours. Donc c'est bien. Maintenant, avant de passer à autre chose, je vais juste vous montrer quelques outils de productivité, certains paramètres dans Visual Studio qui peuvent aider à la productivité. Premièrement, vous pouvez toujours utiliser ce raccourci pour exécuter la liberté de code. Donc, lorsque vous avez ces instructions en utilisant que vous ne voulez pas simplement cliquer dessus, maintenez la touche Contrôle et appuyez sur la touche puis E. Mais il supprime juste et corrige l'indentation sur toutes ces choses, faisant tout ce dont vous avez besoin. Il y a des façons de personnaliser vos propres normes pour ce qu'un nettoyage devrait ressembler, mais je n'entrerai pas dans cette valeur nulle. Un autre conseil cool ou deux autres conseils cool que je vais partager avec vous, n'est-ce pas ? Non. Impliquer vous allez à Outils, Options, aller à l'éditeur de texte, C-Sharp, avancé. Et puis vous pouvez activer sur la marge d'héritage show qui sera utile plus tard au fur et
à mesure que notre obligation et s'agrandit et nous aurons plus d'abstractions et ainsi de suite. Donc, cela est vraiment utile, surtout quand vous avez affaire à de grands projets avec beaucoup d'obstacles. Et un autre que vous trouverez utile est la pâte. Où est-il ? À l'utilisation ? On y va. Ajouter Manquant en utilisant leurs actifs sur le collage. Donc, cela signifie que si vous devez copier et coller du code, disons lors d'une copie et coller ce bloc de code dans un nouveau fichier, il ajoutera automatiquement l'utilisation pour les demandes de réservation, ce qui sera que l'utilisation de sorte que vous n'auriez pas à vous asseoir là et essayer de contrôler les données et de remplir toutes les choses qui nous manqueront. Il le fait automatiquement. Je pense donc que ce sont deux bons outils de production. Au fur et à mesure que vous refactorisez, vous voulez être aussi efficace que possible. Et quand vous avez ce genre d'outils qui vous aident réellement,
notre aide à réduire la probabilité que vous commettiez une erreur en cours de route. Alors maintenant que nous avons réussi notre premier cycle de tests, n'est-ce pas ? Nous avons écrit, j'ai lu des tests, écrit des citations mises en œuvre, et nous avons refactorisé. Ensuite, fondamentalement, nous juste rincer et répéter. Donc c'est tout pour la première section. C' est notre premier test unitaire. Mais maintenant, nous allons entrer dans un peu plus des exigences du système sont les exigences l'application et commencer à pêcher ou plus de choses sont des tests. On va devenir un peu plus compliqués. Et on va juste s'amuser. Je vais juste dire qu'on s'amuse tout en continuant.
6. Réduire la liste complète des exigences avec les projets GitHub: Salut les gars, bienvenue. Maintenant, dans cette leçon, nous allons juste pêcher toutes les exigences pour l'application que nous devons construire. Tu as déjà traversé notre premier cyclin. Nous avons le goût d'écrire le test, d' implémenter le code, puis de refactoriser. Nous savons donc que nous avons deux pièces maîtresses écrites pour tout le reste, mais nous devons savoir exactement ce que nous devons faire. Donc, dans le dépôt que j'ai déjà créé pour cela. Et vous pouvez aller de l'avant et créer le référentiel et vous pouvez l'examiner en utilisant les liens sexuels et de code source. Nous allons sauter sur les projets, quelqu'un pour créer notre projet dans Git Hub, Create Project. Et je vais nommer ces exigences. Eh bien, laissez-moi qualifier un peu plus de chambre réservation exigences de tiret sont, je pense que l'option de description sur au moins pour null. Et nous pouvons choisir si nous voulons un Kanban de base. Kanban avec commentaires livre, quelqu'un de choisir un modèle de projet Kanban de base. Alors allez-y et créez le projet. Et ce projet Kanban de base est livré avec une petite mise en page pour voir que nous pouvons insérer cartes avec des todos et marquer ce qui est en cours et savoir ce qui est fait. Donc juste pour le contexte, tout
le week-end reproduit ce genre de structure. Si je clique sur les trois points sur ce premier et que je dis Edit rien, alors nous voyons un aperçu du type de syntaxe que nous pouvons utiliser. Un colon de C scintillement entre les deux nous donne ces effets d'étoiles. Si vous utilisez cool, désolé, astérisque, astérisque et tristesse et textes, vous obtiendrez l'audacieux. Vous obtenez votre corps de textes sanguins. Si vous voulez une case à cocher, vous avez juste besoin de vos accolades carrées. Et puis si vous mettez un X là, alors il l'interprétera comme étant vérifié. Bon, donc c'est bien. Pour nodal. Je vais enlever les deux autres échantillons. Quelqu' un va cliquer sur les trois points, disons Supprimer, Remarque cliquez sur OK, faites la même chose pour celui-ci. Supprimer les nœuds, d'accord ? Et puis si nous voulons ajouter une note, nous pouvons simplement cliquer sur ce signe plus. Donc, la première exigence que nous voulons est celle qui
indique ce que nous avons déjà fait pour dire que les résultats retournent avec les mêmes valeurs que les requêtes, afin que nous puissions aller de l'avant et ajouter cela. Donc, si vous voulez, une fois de plus, vous pouvez éditer, je pourrais mettre même des cases à cocher est une qui indique ce que nous avons déjà fait pour dire retourner des résultats avec les mêmes valeurs que les requêtes, afin que nous puissions aller de l'avant et ajouter cela. Donc, si vous voulez une fois de plus éditer, je pourrais mettre même des cases à cocher. Donc pour ce faire, vous voulez avoir un trait d'union pour le faire comme un point de balle, alors vous avez vos crochets pour en faire la case à cocher avec un espace dedans, non ? Donc c'est l'espace des crochets ouverts, fermez le crochet carré. Et puis le verbiage réel pour la tâche. Donc, lorsque nous faisons tout cela et que nous cliquons sur Enregistrer les nœuds, nous voyons que nous avons nos cases à cocher ici répertoriées et que nous pouvons toujours les prendre toutes. Donc, nous avons déjà fait tout ça. Donc je suis juste, je vous montre juste comment nous pouvons utiliser la soustraction nos exigences pour que vous puissiez aller de l'avant et faire ça. Eh bien, je vais continuer à ajouter les autres exigences. Alors je suis allé de l'avant et j'ai juste ajouté les autres. Donc, vous avez les résultats de retour de premier ordre avec la même valeur que nos mêmes valeurs que la requête va de ceux qui sont déjà faits, les autres seraient lancés exception nulle si la requête est vide. Donc, chaque fois que nous allons accepter notre demande de réservation, nous devons nous assurer que nos données sont à l'intérieur de cette demande avant même de tenter la réservation. C' est donc une autre exigence clé à laquelle nous devons répondre. Nous pouvons enregistrer le dossier de réservation de chambre. Nous allons donc bientôt ajouter des fonctionnalités de base de données. Et nous devons nous assurer que nous pouvons le faire. Vérifiez la disponibilité de la chambre avant de tenter la réservation et le magasin de réserver un enregistrement avec identifiant de chambre, retour indicateur de succès sur les résultats. Donc, que votre tentative de réservation ait été réussie ou non, nous devons nous assurer que nous l'indiquons et d'ajouter réellement l'ID d'enregistrement de réservation aux résultats. Voilà donc les choses que nous espérons accomplir. Et vous pouvez voir que j'ai vraiment copié et collé la liste des cases à cocher de l'original sur toutes les autres. Donc, je peux juste me débarrasser de ça quelques balles. Donc d'accord, et maintenant on peut passer à autre chose. Donc je peux juste les déplacer à travers. Donc, c'est fait. Et la prochaine que nous avons est de lancer une exception. C' est regrettable qu'il soit listé de cette façon. Et je ne peux pas le réorganiser. Peut-être que je ne passerai pas trop de temps là-dessus. Donc, au moins, nous savons où nous sommes et nous allons juste les traîner jusqu'
au cours chaque fois que nous sommes sur le point de commencer le travail. Donc c'est que je l'ai acheté pour en particulier modifier les exigences, bien sûr, vous savez, en tant que projets qui seuls ou exigences par James, vous avez ce que vous appelez la portée fluage. Et le point de vue du projet est un excellent moyen de suivre tout ce qui doit être fait. Vous pouvez également combiner cet effort avec l'onglet Problèmes, qui lui permet d'ajouter de nouveaux problèmes, qui peuvent être sous la forme d'une demande de groupe, de nouvelles demandes de fonctionnalités. Vous pouvez leur donner les étiquettes, les ampoules, documentation sur dupliquer d'abord, UDC, quoi que ce soit. Donc, cet outil est très, très puissant. Je vous recommande de passer du temps à apprendre comment il peut être utilisé dans vos projets. Mais ce n'est pas le cas, c'est un cours pour une autre fois en ce moment, nous
voulons juste nous concentrer sur le respect de ces exigences. Donc, quand nous reviendrons, nous commencerons à travailler sur le prochain.
7. Test et mise en œuvre : Jetez de l'exception lorsque la demande est Null: Bon, donc nous sommes de retour dans notre code sur le wearable pour commencer avec notre prochain test. Donc je vais juste effondrer la précédente. Et puis je vais mettre mon effet sur la notation. Et cette fois, nous allons avoir le vide public. Et le titre de test sera devrait lancer une exception pour les requêtes nulles. Donc avec cela à l'esprit, et je vais juste revoir ou juste vous rappeler à quoi ressemble le test 3. Nous avons l'orange, nous avons l'application, et ensuite nous avons l'affirmation. Connaissant ce test, il voit qu'il ne devrait pas
y avoir de requête ou que la valeur de la requête doit être nulle. Donc, je ne suis pas allé à iRange et vous demandez un objet. Je vais cependant avoir besoin du processeur. Et puis mon affirmation va
ressembler à un mercredi que vous devriez laisser cette fois. Donc ça va être un bon docteur. Lance donc vous avez jeté un clou dans un évier si nous utilisons Async, bien sûr, nous allons parler à elle vient de nous apprendre sur AsyncTask ce que les autres utilisent throw pour null. Et puis je lui donne le genre d'exception et il devrait jeter. Donc, je voudrais sur l'argument, les exceptions nulles, argument et toutes les exceptions sont ce que nous sommes censés lancer parce que
nous voyons que l'argument qui a été passé à la méthode était nul. Donc devrait lancer une exception. Et puis j'ouvre les accolades. Et si vous regardez juste la, regardez les paramètres est C, C'est son guide. Vous êtes en train de vous guider, nous permettant de regarder, vous pouvez mettre en place. Donc je vais faire quelque chose comme un délégué. Donc à l'intérieur de ces parenthèses, je vais faire une autre paire de parenthèses avec la flèche Lambda. Et puis je vais mettre dans ce processus ne sont pas réserver appel de chambre. Mais ici, je dirai nul, non ? Donc, nous testons si la requête ceux dans comme null, alors il devrait lancer un symbole d'exception, non ? Et si vous utilisez la recherche ou le natif dépassant sa syntaxe, alors ce serait à peu près de la même manière sauf que cela dirait affirmer, et ce serait lancer. Donc vous voyez qu'ils sont semblables. Mais une fois de plus, le conflit de choix de l'utilisateur a toujours cherché à vous montrer l'équivalent ce que j'utilise, la variation judicieusement et tout problème. Donc, c'est vraiment des artistes, nous voulons nous assurer que si l'argument est nul, que nous lançons une exception, ou je peux étendre cela et effectivement obtenir l'exception qui est levée. L' exception est égale à. Et puis nous pouvons faire d'autres asserts sont des vérifications pour s'assurer que le exception.com donc le nom de param serait ce qui est commun en buctant l'exception, non ? Je peux voir devrait ou devrait l'être. Et entre parenthèses, je verrai le mot demande. Donc, quand cette exception est levée, elle devrait revenir avec voir, oh, elle a été levée à cause de ce paramètre, qui dans ce cas devrait être des requêtes étant null. Bon, donc c'est à ça que ressemblent nos affirmations. Bien sûr, si nous faisons une construction, vous pouvez vous assurer que rien n'est cassé. Si je fais mes tests, alors nous obtiendrions ou test rouge. Et ce que je vais faire, c'est d'adopter l'expert du test à ma droite. Je pense qu'on a assez de biens immobiliers pour qu'on puisse
l'avoir à droite et tout de même aller bien, non ? Donc, si nous regardons à travers, nous voyons que nous aimons toujours le précédent contrôle et maintenant nous avons ce nouveau test échoue. Très bien, donc je vais juste aller de l'avant et implémenter celui-ci en même temps parce que ce n'est pas beaucoup de travail où il faut
ajouter quelque chose pour s'assurer que les choses ne sont jamais nulles. Donc on passe à notre processeur. Et puis à l'intérieur d'une méthode de formulaire qui a maintenant au moins l'un des deux tests échouant, nous pouvons ajouter du code pour le faire PaaS. Donc, je vais juste dire si la demande ou la réservation demande plutôt donc le nom du paramètre. Donc juste là, nous allons échouer une affirmation aussi ce que nous regardons. Donc si la demande de réservation est nulle, d'accord ? Et dans les versions plus récentes de C sharp, vous pouvez réellement écrire est null. Donc, si la demande de réservation est nulle, alors nous lançons une nouvelle exception d'argument. Et puis pour ce nom de param, je vais voir un nom éteint. Donc, vous voulez toujours vous assurer que vous gardez vos trucs fortement tapés, puisque cela va pour agir mais la chaîne et ajouter une chaîne statique, je suis juste sûr de voir un nom. Je dirai que si ce paramètre change, le refactor est plus facile. D' accord ? Laissons donc réexécuter ce test. Et je pense que l'une des assertions
échouera indépendamment et nous pouvons regarder ces messages d'erreur. Donc, affirmez soudainement exception, droit, nom de param, et puis il voit devrait être la demande acheté était la cellule des
demandes de réservation est un brin pour vous montrer que cela échouerait toujours. Donc, où nous
sommes, nous avons écrit le test oui, sous-programme que nous pensons fonctionne, mais ensuite basé sur le test que nous avons écrit, il échoue toujours. D' accord. Pourquoi est-ce que ça échoue ? Parce que nous retournons le nom des demandes de serre-livres. Donc, en d'autres termes, où le lecteur renvoie les demandes de réservation de chaîne ici, non ? Mais dans notre test, nous avons vu, laissez-moi revenir aux tests que nous devrions chercher les requêtes de mots. Alors je peux changer point verre besoin de changer mon test. Donc parfois le test érode peut le saigner sur un chemin, ne serait même pas écrire dans un quart. Ella est vieille, peut-être que ce n'est pas nécessairement la salle que je veux faire. Et puis vous refactorisez au fur et à mesure que vous allez. Bon, donc si je relance ce test, je saurai que mes tiques vertes ont raison et que mes assertions sont nulles en effet. Alors pendant que je suis là, je vais juste refactoriser. Donc, nous avons un processeur ici. J' aurais un processeur ici. Et pour la plupart, sinon tous les tests que nous allons effectuer, ils seront tous à bord d'un processeur. Donc, au lieu de faire une nouvelle instance de processeur chaque fois que nous avons une nouvelle méthode, non ? Et puis ce serait 10 points différents à mettre à jour. Ce que nous pouvons faire est de mettre en place un constructeur, n'est-ce pas ? Donc j'allais dire baignoire CTR, baignoire. Et je vais juste mettre sur le processeur de score est égal à notre nouveau processeur. Donc cette seule ligne, je voulais la prendre. Et puis bien sûr, j'ai besoin d'un champ pour ce point de contrôle et de générer le champ. On y va. Alors tout au long, je ne veux plus dur de faire cet arrangement. Droit ? Je n'ai pas besoin d'organiser le processeur à chaque fois parce que maintenant je peux faire mon orange une fois dans le constructeur. Et puis je peux utiliser cet objet arrangé partout ailleurs. Donc, partout où j'avais le processeur, il est toujours sur le processeur de score. Donc, si je lance à nouveau ces tests, nous verrons qu'ils passent toujours et que le code semble plus propre. Donc, une instance au service de nombreux maîtres. C' est donc une autre semaine et commencez à refactoriser vos tests pour réduire la répétition dans la phase de test elle-même.
8. Créer des services de réservation: Tous les bons gars. Donc, la prochaine tâche a tout mis en place quelques choses, y compris notre service ou notre référentiel, qui va stocker toutes nos opérations Gandalf, vous savez, liées aux données. Donc nulle part en regardant plus de séparation des préoccupations parce que nous voulons obstruer la base de données quelque chose de la logique métier réelle, les déclarations if quant à savoir si oui ou non cette requête est OKR et ainsi de suite, n'est-ce pas ? Donc, ce que nous allons faire dans celui-ci, c'est mettre en place notre service de réservation de salle d'oeil. J' ai donc édité cet enregistrement de réservation de salle, rien et j'ai ajouté cette tâche supplémentaire. Vous pouvez le faire si vous le souhaitez, et aussi déplacer le dernier ou le précédent sur la pile terminée. Alors, sautons dans le code. Et dans le projet de base, je vais ajouter un nouveau dossier que je vais appeler les services, les services de données. Et en ce que nous allons ajouter une nouvelle, je vais juste dire classe, mais ce sera vraiment une interface. Et je le nettoie au service de réservation de chambre. Et nous pouvons ajouter cela. Nous changeons cela à l'interface publique. Et dans cette interface, nous allons avoir une méthode qui reviendra,
eh bien, elle n'a pas besoin de retourner quoi que ce soit. Ouais, c'est une méthode de sauvegarde donc ça ne retourne rien, du moins pas de rétine. Donc c'est nul, Save, et il va prendre le paramètre pour la réservation de la chambre, n'est-ce pas ? Le fait est que jusqu'à maintenant, nous avons traité des demandes et des résultats. Cependant, lorsque nous enregistrons, nous devrons voir comme une version prête à la base de données de la requête. Et cela va nous obliger à introduire un nouveau type. Donc je vais juste mettre un nouveau dossier. Je ne veux pas appeler ça la méchante des modèles et aimer le domaine. Et puis au lieu de domaine, nous allons ajouter une nouvelle classe. Eh bien, c'est bon. C' était l'étape un par un, c'est ça. Alors je suis allé appeler cette réservation de chambre. Droit ? Et puis c'est la réservation de chambre. C' est donc notre nouveau type de données dont nous allons avoir besoin. Donc i service de réservation de chambre et il est bon d'avoir une méthode pour voir la réservation de la chambre et il s'attend à obtenir quelque chose sur les réservations de chambre de type données. Donc, le chemin jusqu'à transformer les valeurs
des demandes de réservation de chambre, peu importe ce qu'il est. Donc, si vous avez fait la conception de l'application, vous apprécieriez que parfois vous devez masser l'entrée avant de pouvoir l'envoyer à la base de données. Donc c'est pour cela que nous préparons notre code en séparant ces null, j'ai besoin de cette salle en réservant certains, juste pour créer ce nouveau fichier par lui-même. Mais pour l'instant, il va avoir les mêmes champs que les requêtes. D' accord, donc je vais aller de l'avant et copier et coller les. Et vous pouvez voir cette extension sur la fonction R-dot qui est ajouter vous
encourager à activer récemment au travail, à
droite, quand je l'ai collé automatiquement ajouté que l'utilisation de l'instruction pour moi. Et il Whoa, ce que je vais faire, c'est sortir ça des services de données et mettre ça dans le sens de la loi. Et puis je vais changer cela en domaine bien sûr, et mettre à jour la référence à l'intérieur de l'interface. Donc, c'est au moins une étape pour juste se préparer pour le prochain mouvement, qui est quand nous écrivons le test, nous aurons l'interface prête à l'emploi. Et ce que nous allons faire, c'est nous assurer que nous sauvegardons nos demandes de réservation de bureau. Et c'est ce que nous allons travailler dans le prochain test.
9. Test unité : Enregistrer une réservation de chambre: Bon, donc nous sommes de retour dans notre code de test et le prochain test que nous allons faire est de vouloir nous assurer que nous sauvegardons réellement le dossier, non ? Donc je vais juste copier tout cela et récompenser en conséquence. Et ce test va être appelé devrait économiser les demandes de réservation de chambre. Bon, maintenant à l'intérieur de ça, ce qu'on doit faire, c'est appeler notre processeur. Celles-ci, bien sûr, nous devons appeler. Et nous appelons les salles de lecture pour que vous puissiez voir à quel point c'est plus facile. Nous savons que le processeur est là pour vous, donc vous n'avez pas à l'initialiser à nouveau. Et à l'intérieur de cela, nous avons besoin de notre demande. Non. Nous n'avons aucune demande. Il faudrait organiser une autre demande, mais nous avons déjà arrangé notre demande ici. droite. Donc ce que je vais faire, c'est suivre. Je vais retirer ça de l'arrangement pour ce premier test que nous avons fait. Et je vais le mettre à l'intérieur du constructeur. Et au lieu d'avoir une variable locale, je vais le faire dans un champ. Donc, nous générons le champ sur la demande de score. Et puis partout où cela dit que seules les demandes, nous remplacons simplement par une demande de soulignement. Cette requête représente nos demandes de tests et une demande d'artiste peut être utilisée partout où nous en avons besoin car cette offre bat
à nouveau cet objet, mettre dans le constructeur, et ensuite nous pouvons simplement le réutiliser à travers les artistes. Alors maintenant que j'ai fait les leads plus mondiaux de l'Irene que nous pouvons simplement sauter directement à droite. Maintenant, avant de pouvoir faire des assertions ici, nous devons mettre en place, copier notre version prête pour les tests de notre interface. La raison pour laquelle nous avons fait les interfaces pour qu'il puisse être injecté partout où nous en avons besoin. Mais c'est toujours une interface qui doit être configurée car elle a une méthode. Nous devons voir dans des circonstances de test hôte si cette méthode fonctionne. C' est ce qu'on appelle se moquer. Donc heureusement, il y a une très bonne bibliothèque utilisée pour ce genre de chose. Et nous allons voir comment cela fonctionne null. Donc, je vais dire soulignement marque de service de réservation de chambre est égal à nouveau Mock capital M ou CK hors de notre interface, je vais juste copier rapidement cela et coller automatiquement obtenir les déclarations d'utilisation, c'est tellement cool. Et puis fermez les accolades. Et puis pour la simulation, ce n'est évidemment pas quelque chose que nous venons d'avoir. Serions nous contrôler le paquet d'installation WC, mock, disons peut aller de l'avant et laisser NuGet, trouver et installer la dernière version. Et quand cela est fait, nous obtenons automatiquement l'instruction using. Et puis nous pouvons initialiser notre champ par le service de réservation de salle de nom mock ou. Alors. Notez que c'est hors du type que nous voulons, mais c'est aussi MC. Donc nous disons de me donner un objet fictif hors du type de données. Cependant, cet objet est encore un peu vide. On doit faire ce qu'on appellera l'installation. Donc nous sommes toujours dans cette phase de portée. Et maintenant, nous devons vraiment asseoir cette méthode pour faire ce que nous pensons qu'elle devrait faire avant d'y arriver cependant. Plus important pour moi, c'est le fait que nous devons injecter ce service dans notre processeur. Donc, si vous n'êtes pas si familier avec ce qu'est l'injection ou l'injection de dépendance, je vous suggère de regarder l'un de mes cours précédents sur le développement du noyau ASP.Net, où nous montrons ce qu'est vraiment l'injection de dépendance et comment cela aide. Maintenant, à ce stade, il s'agit d'un service que le processeur va
vraiment utiliser après avoir terminé sa logique métier sur ses vérifications, il va utiliser ce service pour effectuer tout changement
réel qui doit se produire lors de la réception du les demandes. Donc, cela signifie qu'il a besoin d'un objet de service de réservation. Il n'a pas encore été préparé pour cela. Donc, ce que je vais faire est de prendre cette déclaration de processeur et je suis allé la déplacer. Donc, après que nous avons le Mach, puis je suis allé dire cela qu'il devrait aussi prendre un paramètre de notre objet simulé. Donc, quand nous disons simuler, c'est littéralement le genre de n'importe quel type. Mais nous voulons le type de béton réel. On doit voir les objets simulés. Et si vous survolez l'objet, vous voyez qu'il nous donne réellement sur le service de réservation de salle d'oeil. Le service de réservation de chambre est en fait le MAC de ça. Donc, nous avons la valeur physique. Maintenant, la ligne rouge, nous pouvons traiter cela en disant controller.js et ensuite nous pouvons le
dire au paramètre à notre constructeur pour nous, n'est-ce pas ? Donc, c'est vraiment réduire l'argent et l'argent entre le code rapidement. Ils voient non, la ligne rouge a disparu. Si nous sautons, ce n'est pas obtenir cet objet, nous reviendrons et renommerons ce non reflété assez tôt. Mais en ce moment, je vous montre ce à quoi nous nous préparons parce que dans tout ce que nous pouvons injecter le service dans notre processeur de requêtes et ensuite nous pouvons utiliser n'importe quoi hors du service à l'intérieur de n'importe quelle méthode à l'intérieur de notre processeur. Donc, revenons à notre test jusqu'à présent ou notre gamme nous a avec les demandes de test. Ensuite, il a mis en place le dépôt Mach, notre service simulé. Et puis nous configurons notre objet processeur, qui prend cet objet simulé comme paramètre. Connaissant notre test réel, je dois faire savoir au simulateur comment il devrait se comporter. J' aurais pu le faire ici. Mais ça aurait été mondial. Et une seule méthode a vraiment besoin de ce genre de configuration pour le moment au moins. Bon, alors voyons à quoi ressemblera cette méthode entière. Donc, nous devons encore faire un arrangement. Et je vais le faire au-dessus de l'acte. Donc inserts ou l'optimal, nous, clairement les choses ont changé. Alors mettons-nous en place ce dont nous avons besoin. Donc je vais avoir mon objet de réservation de type chambre. Rappelez-vous que nous venons de créer celui-ci dans le domaine. Donc, la chambre sera roi est égal à null. Donc ça commence vide. Ensuite, nous allons voir notre objet fictif. Nous pouvons dire la configuration des points MLK. On y va. Et cela prend une expression lambda, je vais juste utiliser q. et ensuite nous pouvons appeler la méthode que nous voulons définir. Bon, donc en d'autres termes, quand ce Mach est impliqué, comment voulez-vous que certaines méthodes se comportent ? Regardez sur la méthode2 dans une circonstance de test, c'est ce qui apporte à la table. Donc je suis allé voir la sauvegarde parce que c'est ce que nous allons faire des tests, non ? Lorsque vous êtes appelé, Vous êtes que je suis en train de mettre en place pour savoir qu'il devrait en prendre, donc je vais voir qu'il s'agit d'un objet hors de la réservation de la demande. Donc, la chambre sera King demande type. On y va. Très bien, puis fermez les parenthèses. Donc ça devrait marcher ce que je vois notre ligne rouge. Et c'est parce que j'utilise le mauvais type de données. Ça devrait être des apologistes de réservation de chambre, non ? Donc, ils vont sauver les objets de domaine, non ? Donc, cela devrait dire Enregistrer, c'est n'importe quelle réservation de chambre. Donc, donnez-moi n'importe quel objet tant que c'est un régime doux, réservation de chambre. droite. Alors, pour continuer, je vais faire ce que vous appelez un coureur d'appel. Donc, en d'autres termes, lorsque cette méthode est appelée, que devrait-elle faire semblant de faire ? Donc, la méthode de rappel va dire R. Il vous donne le type de données qui est que je devrais citer un retour ou un processus sans citation. Quand cela est appelé. Vous pouvez lire la documentation si nécessaire. Mais pour l'appel, on va voir une réservation et une expression lambda. Donc, c'est presque comme une fonction déléguée vraiment. Et puis à l'intérieur de cela, nous allons voir que l'objet de réservation de chambre ici est égal à l'objet de réservation ici. Peut-être que je peux quantifier ces noms un peu plus. Quelqu'un à voir. Sauvé à la recherche. Bon, donc le Save, l'objet de réservation que nous avons commencé comme nul devrait savoir, obtenir la valeur de tout ce qui a été passé pendant le test. Bon, point-virgule, point-virgule. Et c'est notre configuration pour notre simulateur, ou la configuration de la méthode de sauvegarde dans notre objet simulé pour notre service. D' accord, donc cela semble compliqué, mais une fois que vous commencez à le faire de plus en plus, cela deviendra plus facile et cela aura plus de sens. Donc, après avoir fait ça, on appelle le processeur. Et puis après avoir appelé le processeur, nous devons vérifier que la méthode a été appelée quelqu'un pour dire point fictif. S' il vous plaît vérifier cela. Et puis notre expression lambda, Save or Save Method. Et nous vérifions qu'il en a un, l'objet de réservation. Et puis deux, on va vérifier. Droit ? Donc, vérifiez cela, enregistrez avec c'est n'importe quel objet de réservation. Et puis le paramètre suivant, si vous passez juste la souris, vous le verrez dans l'expérimentateur serait le nombre de fois qu'il a été appelé. Donc, vous pouvez mettre assez de message d'échec, vous pouvez mettre dans différentes choses. Mais ce que nous voulons vérifier, c'est qu'il a été appelé 1 fois 1. D'accord ? Donc, dans des situations comme celle-ci,
ce que vous pouvez faire est de dire lorsque vous appelez une méthode ou lorsque vous effectuez cette option, vérifiez que certaines méthodes clés en cours de route ont été appelées une ou deux fois. Dites que si vous testez cela avec cette entrée, cette méthode devrait être appelée deux fois, ou si elle devrait être appelée trois fois, et cetera. Vous pouvez voir une fois, vous pouvez voir exactement une fois, au moins une fois, non ? La plupart, le moins, pour ainsi dire, n'est-ce pas ? Donc, vous pouvez, Il est assez flexible avec les temps que vous pouvez utiliser. Une fois de plus, on est à la fois. Je ne veux pas savoir s'il a été appelé deux fois, alors j'ai une erreur. Bon, maintenant, après ça,
vérifiez, nous pouvons aller de l'avant avec plus d'assertions. Donc, nous pouvons voir affirmer que ce n'est pas nul. Donc enregistrer le point de réservation ne devrait pas r. Laissez-moi juste null. Parfois, c'est, Il est plus facile de juste le mot filtre non analytique qui est vieux. Donc, il ne devrait pas être nul. D' accord ? Et toutes les affirmations seraient semblables à ça. Ce que nous avons fait ici, où ils devraient être égaux. Donc, demande point nom complet. nom complet du point de réservation CVE doit donc être le même que le nom du flux de demande. Le courriel doit être identique à celui de la demande et la date doit être la même qu'une date. D' accord, donc ce sont mes affirmations. Je vais lancer juste ce test et en cliquant dessus avec le bouton droit de la souris. Donc, dans les graines d'experts de test, ils sont dessus. Pas mal. Il n'a jamais été ruiné, donc il ne sait pas si ça allait ruiner. Et puis je peux juste cliquer dessus et dire Exécuter. Et en Russie et il a échoué. Et si nous jetons un coup d'oeil à ce que vous avez vu, il dit que l'invocation attendue sur le simulacre une fois acheté était 0 fois Save. Très bien, donc il dit que nous nous attendions à ce que cela soit appelé au moins un. Donc, chaque fois que nous avons fait l'acte, mais il n'a jamais été appelé. D' accord. C'est donc tout ce que la vérification MAC fonctionne. Donc non, nous pouvons aller de l'avant et lire, désolé, nous pouvons aller de l'avant et implémenter le code pour rendre tout cela appelé à la vie.
10. Mise en œuvre : Enregistrer une chambre: Donc, de retour dans notre processeur, nous allons mettre ce dont nous avons besoin pour que notre test soit accepté. Donc on voit que deux tests sur trois passent, n'est-ce pas ? Et nous devons écrire le rappel de l'échec du test. Donc, parfois, il est bon de simplement avoir ceci afin que vous puissiez lire le message et ensuite regarder votre code en même temps. Parfois, vous savez, juste les avoir en même temps peut vous
aider à supposer ce que vous devez modifier. Donc, à ce stade, ce que je veux faire est de nettoyer un peu cela. Donc je dois finir cette injection, non ? Donc, Control pointe la bonne instruction d'utilisation pour cela. On y va. Et je suis allé appeler le nom de cet objet lui-même notre service de réservation de chambre, point de
contrôle, et lui permettre de créer un champ assigné. Comme, comme vous le savez, je préfère utiliser le trait de soulignement pour les noms de champs. Donc je vais changer ça en un facteur unaire. Et puis à peu près ce que nous devons faire est de présenter le de. Donc, un, nous recevons les demandes de réservation. Si c'est nul, nous lançons l'exception afin que nous sachions à ce sujet. Mais entre le lancer, il y a la vérification et la vérification que c'est correct et de retour, nous devons sauver. Donc si ça va, on doit sauver. Donc ce que je vais faire ici, c'est juste dire service de réservation de chambre, dot save. Et puis cela prend une nouvelle chambre des objets de réservation. Alors dis juste une nouvelle réservation de chambre. Et je n'aime pas voir ces préfixes se référer à mettre dans l'instruction using. Donc, réservation de chambre. Et puis cet objet a besoin de données qui sont à peu près les mêmes données que celles qui auraient été présentes dans les demandes de réservation, n'est-ce pas ? Donc, je vais juste copier ceci et le coller là. D' accord. Et nous l'avons là. On y va. Donc maintenant, nous avons notre réservation de chambre en cours d'enregistrement ou la méthode de sauvegarde étant appelée. Obtenir n'importe quel devis, n'importe quel objet à la recherche d'une pièce. Et sachez que si je relance mon test, alors je me lève en passant le score. C' était si facile que non. De toute évidence, il y a beaucoup de répétitions ici, non ? Entre cette ligne se trouvent ces quelques lignes, ces quelques lignes et les similitudes entre notre demande de réservation et notre résultat sur le domaine réel. Il y a une opportunité pour nous de nettoyer le couloir qui approche, en répandant tous les morceaux de code. Commençons par voir les similitudes et voir comment nous pouvons condenser, non ? Donc, nous avons la réservation de chambre avec ces trois champs, alors nous avons une demande et les résultats web. est important de les garder séparés. Cependant, nous voulons réduire la répétition entre tous. Pour que nous puissions vous présenter, je vais juste copier et coller un des résultats de réservation de chambre. Et le hub d'automne hiver ici est la réservation de chambres. Base. bys de réservation de chambre représenteront et juste des points de contrôle. Ou plutôt j'ai besoin de renommer ce fichier, désolé, donc juste renommer la classe. On y va. Donc on aura une base de réservation de chambre, qui a tous les objets, non ? Et je suis allé rencontrer ce résumé parce que je ne veux pas que quelqu'un puisse créer une instance de la pièce à l'image de BCE. Mais il va servir le but de l'héritage sur tous les autres. Donc, je peux supprimer leurs déclarations manifestes des champs qu'ils ont en commun parce que maintenant tout existe dans la base. D' accord. Donc, la même chose pour la recherche de chambre, je peux supprimer cela et le laisser hériter de la base de réservation de chambre. Maintenant, si je fais une construction, tout le monde est toujours heureux. C'est bien. Donc ce travail de refactorisation. D' accord. Et comme je le disais, lorsque vous initialisez la marge d'héritage, vous seriez capable de sauter entre les fichiers sous implémentations de base beaucoup plus facile, ok, ou beaucoup plus facilement. C' est donc ce qu'est cette marge d'héritage. Quatre, si ça marche pour toi, si tu trouves ça cool, alors pas de problème. Si ce n'est pas le cas, alors c'est bien. Maintenant, quand nous revenons à notre processeur, nous avons l'occasion de faire la création de ces objets. Je serai plus générique. Parce que vous voyez ici, nous ne faisons que répéter le code. Et ils sont tous les deux sur le dossier vient des demandes de réservation. Donc, je vais créer une méthode privée qui va retourner le type de données T. Donc, si vous avez déjà entendu parler de réservation de thé générique ou de salon de thé, non ? Donc, la réservation du salon de thé, je l'appelle juste générique. Créer. Objet de réservation de chambre. Ou je dirai juste créer, ouais, de la chambre. Objet roi. Je suis explicite avec mon nom de méthode, c'est tout. Et puis ça va lui faire savoir qu'il s'agit d'un générique, n'est-ce pas ? Donc, nous l'appelons juste objet de réservation de chambre T, créer un objet de recherche de pièce est le nom de la méthode et son paramètre
générique est tout ce qu'il devrait retourner. Il va prendre un paramètre des demandes de réservation de chambre. Donc je vais juste copier ça, le coller là. Et puis je vais démêler ça pour que nous ayons un peu plus réaliste pour cette activité. Et puis je suis allé à spécifier où le salon de thé sera objet roi est hors type chambre base de réservation. Droit ? Donc, en d'autres termes, je suis prêt à être en mesure de passer dans n'importe quel sont appelés cette méthode et je dois passer dans un paramètre ou lui faire savoir que le générique étant relatif à
la réservation de salle de type de données soit donc n'importe quoi héritant de la réservation de chambre abeilles peut être utilisé comme un générique. D' accord ? Donc, après avoir fait cela ou la mise en œuvre est fondamentalement juste va
dire retourner un objet de réservation de salon de thé. Et à peu près, il va juste avoir les mêmes champs que le nom complet. Gorge, email. Désolé, j'aurais dû mettre ce nouveau mot clé retour, nouvelle réservation de salon de thé, point-virgule. Et je reçois une erreur
, créez une instance 0. Il n'arrête pas le nouveau, désolé, qui aurait dû être nouveau, la fin de celui-ci. Et on y va. Toutes les lignes rouges ont disparu. D' accord. Donc, je suppose que je pourrais raccourcir certains des noms, à
droite, pour qu'il ne s'étire pas si loin sur les multiplets d'écran que je vais faire est juste de casser la ligne pour que vous puissiez voir tout le code. Donc, tout cela est la première ligne. Et puis nous ouvrons les accolades, puis nous faisons notre mise en œuvre ici. D' accord ? Donc, le but de ce sera de remplacer nos déclarations explicites ici est au lieu de voir une nouvelle réservation de chambre et de répéter que je peux savoir, disons crée un objet à la recherche de pièce. Je veux quelque chose hors type chambre sera King, qui hérite de la base. Et je transmets les demandes de réservation comme paramètre. Voilà, tu y vas. D' accord ? Et puis je peux faire la même chose pour les retours. Donc, je peux juste dire que le retour crée un objet de recherche de pièce, mais ce serait la règle de temps libre, les résultats de réservation de chambre de type. Et on y va. Donc, cela semble beaucoup plus propre, beaucoup moins de répétition entre les deux. Et nous voyons comment les génériques peuvent nous aider à garder notre code propre. Et juste resté la suggestion de Visual Studio pour moi à la méthode statique. On y va. Bien sûr, le moment de vérité est trois tests, donc je vais faire tous mes tests. Et j'ai des tiques vertes tout le chemin. C' est donc tout pour mettre en œuvre ce test. On a fait un refactorisation et on a fait le test. Et encore une fois, nous allons continuer à
mener ces activités en conséquence.
11. Test unité : Vérifier que la chambre est disponible: Eh bien, nous sommes de l'équipement. Oh, gentil. Donc, nous passons à la prochaine activité et c'est la disponibilité de la salle de contrôle avant de tenter la réservation, n'est-ce pas ? Nous devons donc ajouter une certaine logique pour nous assurer que nous vérifions et voyons s'il y a des chambres disponibles. Et puis s'il n'y a pas de chambres disponibles, alors nous ne routable clé. Et j'envoie le symbole, non ? Bien sûr, faire la comptabilité est la même chose que sauver le groupage. Alors passons à nos tests. Et je vais juste faire la copie régulière, coller et renommer. Et celui-ci ne devrait pas économiser les demandes de réservation de chambre si non disponible. Donc, à l'intérieur de cette méthode, nous devons faire quelques choses. Avant d'arriver à cette méthode. Nous avons réellement besoin de créer de nouvelles méthodes dans notre service de réservation. Laisse-moi passer à l'interface. Il ne met pas en œuvre, donc désolé, c'était le contrôle F 12, vous devriez avoir, vous pouvez utiliser les restes, peut contrôle-clic. Et ici, je vais dire, donnez-moi une nouvelle méthode qui revient. Je vais utiliser I innombrable, je pense que c'est un générique dans nos types de collection. Alors donne-moi une collection de chambres. J' ai donc besoin d'un nouvel objet appelé chambre. Et je suis allé appeler ceci, obtenir des chambres disponibles encore disponibles. D' accord. Non, Cette méthode va devoir prendre la demande le droit. Donc je dirai juste que Datetime l'a fait. Et tout ce dont nous avons besoin pour créer ces nouveaux objets. Donc, la création d'un nouveau fichier. Et bien sûr, les objets de cette pièce doivent être dans le domaine, non ? Donc je vais juste le déplacer, changer l'espace de noms. On n'a pas besoin de quoi que ce soit dans cet objet. On a juste besoin de savoir qu'il est là. Et nos interfaces Happy obtient les chambres disponibles est ok, c'est bon. Maintenant, à l'intérieur de notre test avec notre configuration pour notre simulacre, nous devons lui faire savoir qu'il devrait revenir. Eh bien, en configurant le Mach, je dois laisser la méthode de disque disponible savoir qu'elle devrait retourner la liste des pièces. Maintenant, à ce stade, je vais, d'accord, je vais laisser cette étape à l'étape du refactoring. Mais ce que nous allons faire est de tirer ce genre de configuration, configuration à l'intérieur du test. Ce que nous avons fait à une date si ultérieure. Donc, pour null, laissez-moi juste aller de l'avant et faire le même genre de configuration d'un cas IV, vous voulez juste un rappel, vous pouvez toujours regarder la configuration précédente où nous avons fait la configuration pour notre coffre-fort. Donc nous avons besoin d'une liste de chambres. Je vais créer une liste de brièveté de champ de type salle pour cette salle de type trucs. Allez-y et ajoutez la déclaration use, et je vais appeler cette chambre disponible. Donc, si c'est privé sur le score des chambres disponibles, non ? Et puis à l'intérieur de notre constructeur, je vais initialiser les chambres disponibles pour être une nouvelle instance de listes avec de la place, avec au moins une pièce dedans. Donc de nouveaux objets de pièce, au moins un. Donc, comme ça, nous savons que ce n'est pas vide. Donc, dans la configuration, nous allons dire service de réservation de chambre OU, configuration de points simulés. Et cette fois, je vais appeler la méthode des chambres disponibles, qui va prendre sa demande comme paramètre. Et remarquez dans cette situation que j'utilise une valeur exacte. Je n'utilise pas l'arbitraire. Ce n'est pas une pièce à regarder parce que nous avons littéralement besoin de tester par rapport aux demandes, besoins que nous pouvons changer à tout moment. Donc, la mise en place encore des chambres disponibles. Et puis pour celui-ci, c'est une valeur qui revient. Donc, ce n'est pas éviter comme l'épargne où nous avons juste dû effectuer sur l'oxygène. Donc, cette fois, je dois voir ce points BreakLine revient. Et puis il nous dira ce qu'il est prévu de
retourner ou watts délégué nous pouvons effectuer, mais j'avais juste besoin d'effectuer le retour avec les listes de chambres disponibles. Nous avions IRI et sachant auparavant se contenter d'un test, après avoir fait tout cet arrangement avant cela,
ce que je vais faire est des chambres claires ou disponibles parce
que rappelez-vous qu'il ne devrait pas faire la réservation s'il y a un indisponible. Donc, si les chambres disponibles sont le point de référence, alors quand je fais ce test, je vais m'assurer qu'il y a citation unquote, pas de chambres disponibles. Ensuite, je vais appeler mon processeur pour réserver une chambre avec la demande. D' accord ? Et puis je vais vérifier, et je vais juste copier et coller. Little a écrit tout ça avant, donc je vérifie juste que ça n'est jamais appelé. D' accord. Agréable et simple, non ? Donc, nous allons de l'avant et nous voyons une fois de plus des chambres disponibles. Oui, nous avons une liste des chambres disponibles. Nous avons une liste et il y a au moins une pièce dedans. Nous savons donc que nous pouvons tester les chambres disponibles. Mais dans ce cas, nous voulons dire qu'il ne devrait pas faire de réservation si elles ne sont pas disponibles. Je vais donc simuler qu'aucune chambre de réservation n'est disponible en effaçant ma liste. Et puis le processeur va faire son appel régulier. Et puis nous allons juste vérifier que ça n'est jamais appelé. À ce stade. Cela agit comme une affirmation. Je n'ai pas besoin d'autre assertion parce que je n'ai pas besoin de vérifier que les valeurs sont retournées ou que celles de qui que ce soit sont les mêmes que
toute autre chose. Ça va juste voir qu'on ne l'appelle jamais. D' accord, alors testons ce nouveau. Et nous sommes lus et je pense que nous sommes prêts à y aller. Laissez-nous donc passer à l'implémentation du code pour que cela se produise.
12. Mise en œuvre : Vérifier que la chambre est disponible: D' accord, Donc nous avons déjà testé, allons sauter et faire nos modifications pour faire passer l'artiste. Donc, en sautant vers notre processeur de requêtes, la condition est que s'il y a des chambres disponibles, alors nous pouvons aller de l'avant et voir s'il n'y a pas de chambres disponibles, alors la méthode save ne devrait pas être appelée. Quelqu' un pour commencer par obtenir les chambres disponibles. Je dirai que var chambres disponibles est égal à mon point de service de
réservation de chambre obtient des chambres disponibles pour le bit de demande actuelle. Ce faisant, je peux voir si les chambres disponibles sont des cônes. Donc, cela renvoie un innombrable SF pour dire que le cône ouvert et fermé est supérieur à 0. Et cela nécessite un lien. On y va. Donc si les chambres disponibles parsèment les cônes, et là, il voit que cela suggère sur ceux-ci que je pourrais voir adopter n'importe quel, n'est-ce pas ? Donc s'il y en a, ce qui me rendrait juste un booléen. S' il y en a, alors je peux voir. Donc avec ça, si la condition nous entrait trois tests et que notre test passe, donc s'il n'y en a pas, alors cela ne serait jamais appelé. D' accord. Ou s'il n'y a pas de chambre disponible qui ne serait jamais appelée. D' accord. Donc nous allons faire deux activités. Non. Premièrement, je vais juste discuter brièvement de ce que j'ai mentionné plus tôt à propos de probablement refactoriser ou réorganiser la façon dont nous faisons nos configurations. Donc, dans le passé, j'ai travaillé sur des projets où au lieu de mettre en place dans chaque méthode, pour chaque méthode unique comme elle est nécessaire. Ce que nous avons fait, c'est
que nous avons créé un seul fichier qui vient de renvoyer toute la maquette avec
toutes les données d'échantillon, toutes les configurations, tout. Donc nous avons 1 de contact. Si vous avez besoin de faire une configuration, si vous avez besoin de faire quelque chose en rapport avec l'objet simulé, nous avons 1 de contacts et tout ce qui est relatif à la façon dont vous interagissez avec les données. Bien sûr, parce que dans notre situation, avant qu'il soit un essai de déchirer ces choses construites, bien sûr comme
des chambres. Vous pouvez construire une pseudo liste de chambres ailleurs, mais les chambres disponibles sont utilisées par d'autres endroits. Donc tu devrais prendre ça en considération. Aussi pour une annonce pour se contenter de la réservation CFD. Nous avons le gain de syllabe ici, mais nous faisons quelques affirmations contre. Alors pourquoi ils sembleraient assez faciles pour juste déchirer tout cet OTA et juste faire l'installation dans son propre fichier. Et puis nous obtiendrions la méthode de sauvegarde déjà configurée. Chaque fois que nous obtenons un objet simulé à travers ce fichier, nous devons considérer certaines des assertions sur les dépendances, non ? Donc, avec cela à l'esprit, je ne vais pas nécessairement aller avant et faire un refactoring avec les tests. Je voulais juste vous dire que si vous voyez l'occasion de le faire, alors vous pouvez savoir que la deuxième chose que je voulais faire est de vous montrer comment vous pouvez déboguer. Donc, parfois, vous pouvez écrire un test qui, selon vous, fonctionne ou devrait fonctionner. Et par rapport au code que vous avez écrit, au moins le test et le code devraient fonctionner ensemble d'autres et pour une raison quelconque, le test échoue et vous n'êtes pas tout à fait sûr pourquoi. Et c'est probablement vous dire une SARM qui n'est pas nécessairement de voir quelle est l'erreur. Donc j'ai fait une erreur ou je viens de modifier les tests que nous avons écrits et modifiés pour qu'il puisse échouer, non ? Donc tu n'as pas forcément à faire cette activité, peux regarder ce que je fais. Ceci, ils peuvent comprendre que cela fonctionne. Alors j'ai fait le fichier de test, non ? Et il dit qu'ils ont inspecté l'invocation sur le Mach est une fois, mais il n'a jamais été appelé. Alors cette brochette, je suis curieux à ce sujet. Mon test dit qu'il devrait l'appeler 1s, mais basé sur le trimestre ROTC le rappelant compte tenu du scénario de test. Donc, bien sûr, je veux savoir à quel moment mon code fait quelque chose que vous ne devriez pas faire. Parfois, il peut être des artistes, n'est-ce pas ? Donc, vous devez juste vous assurer de vérifier les deux côtés. Donc, je vais écrire le test lui-même et ensuite dire Debug. Et avant de déboguer, mettre un point d'arrêt quelque part dans la méthode, n'est-ce pas ? J' aurais dû le dire tout à l'heure. Donc, avant d'activer, vous voulez mettre votre point d'arrêt. Donc, des points d'arrêt réguliers comme ce que vous utiliseriez lorsque vous construisez
régulièrement ou régulièrement quelque chose dans votre code, vous pouvez les utiliser. Et lorsque vous passez en mode débogage avec le test, il les reconnaîtra réellement. Donc ça va aller de l'avant, son rapport avec le scénario de test, non ? Donc, si nous regardons les demandes de réservation, vous verrez que cet objet est exactement le truc de test dont nous avions moqué dans notre classe de test. Si vous regardez les chambres disponibles, ce n'est pas nul. Le demandé est que si je marche, alors vous voyez les chambres disponibles est 0. Pourquoi ? Parce que nous les avons effacés avant que ce test ne soit exécuté. D' accord. Ensuite, je dis si les chambres disponibles sont, alors il devrait aller et dire si c'est 0, si le courant est 0, alors il n'y en a pas. Il saute dessus. Et donc ça ne cause jamais que ce soit pour moi, il fait ce qu'il est censé faire. Donc, alors que l'ECS, je continue et puis il saute à la note de ligne que l'histoire et l'erreur, voir l'invocation inspectée est ceux qui ont été appelés 0 fois. Et puis j'ai réalisé que mon invocation était fausse. Je ne devrais pas vérifier qu'il soit appelé une fois. Je devrais vérifier qu'on l'appelle. Jamais. D'accord. Eh bien, je vous montre juste comment le mode de débogage peut aider à 0. C' est peut-être sur quels points de votre code il fait quelque chose où il est par rapport au test ou à quels points de votre test, vous avez une erreur. D' accord, donc vous devez vous assurer que ces deux-là fonctionnent en tandem pour que
je puisse arrêter de déboguer après avoir apporté ce changement au jamais, vous avez déjà eu ça pour ne pas avoir à vous inquiéter à ce sujet. Mais quand nous réexécutons ce test verra qu'il ne passe pas. Très bien, c'est ainsi que vous pouvez aller de l'avant et ajouter un peu de débogage à vos tests au fur et à mesure que vous allez.
13. Test et mise en œuvre : Ajouter de la pièce Id pour obtenir le résultat: Tous les bons gars. Donc, pour cette activité, ce ne sera pas une activité longue est vraiment juste un addendum à quelque chose que nous avons déjà fait. Et je pense que nous pouvons faire à la fois le test et la mise en œuvre et refactoring tout en une seule séance dans cette situation. D' accord, donc la prochaine exigence est que la pièce d'identité de la chambre qui est réservée soit présente sur le dossier de réservation de la chambre. Donc c'est vraiment un addendum à quand on sait qu'on voit la pièce, on doit s'assurer qu'il y a une prison d'identité. Je saute à notre liste de chambres disponibles et je vais mettre sur le terrain pour l'objet de la pièce. Il n'a pas besoin d'exister. C'est très bien. Mais l'ID est égal à un autre, disons un car je voudrais juste tester la méthode. Donc encore une fois, ce dotnet de contrôle il obtenir la propriété en saut au-dessus. Et vous voyez que c'est déjà un entier, entier public. C' est bien. Bon, donc maintenant nous avons au moins cette pièce d'identité pour notre, alors qu'il devrait jeter, devrait voir, nous y allons. Ce que je vais dire, c'est que le Booking.com enregistré. Et à ce stade, il n'y a pas d'ID de disque sur la pièce qui regarde non plus. Donc, la réservation de chambre base de réservation, pas le résultat peut être le résultat, mais pas la base. Je ne le veux pas sur la base parce que la demande n'aurait pas d'ID de chambre. droite. Donc je vais juste lui donner une propriété, dire une baignoire supérieure d'accessoires. Et ça va être une pièce d'identité. D' accord ? Donc je vais dire réservation sauvegardée, carte d'identité de la chambre. Il devrait être, et il devrait être égal, dans cette situation, le premier ID de la liste des chambres disponibles. Donc je vais juste dire que ce devrait être sur un carré chambres disponibles, points. Tout d'abord, je veux le premier objet dans ses points de contrôle en utilisant l'ID de premier point de lien. D' accord, donc une fois que c'est appelé, alors quand nous vérifions toutes ces choses, cette pièce d'identité devrait être la même que Waterhole était la première pièce disponible dans la liste. Maintenant, faisons les tests. Et parfois, il est difficile de voir sont se rappeler lequel il peut toujours juste cliquer sur la coche et dire l'exécuter. Très bien, donc nous allons juste faire un projet de construction comme toujours. Et puis il peut regarder les statistiques et vous voyez ici que ça échoue. Donc c'était celle-là. Donc, il est dit que sur la base de la masse ou Sean trompé ID de la salle de
réservation devrait être une balle était 0. Donc c'est sympa. Une belle baleine anglaise qui voit ce qui est son mal ou son droit ? Ça devrait être un mais c'était 0 et c'est bien. On s'attend à ce que nous n'ayons rien mis en place. C' est donc la modification du test. Sautons sur le processeur, peut supprimer ce point d'arrêt. Et puis ce que nous allons voir ici, c'est s'il y a des chambres disponibles, dont nous savons qu' il y en aura au moins une. Ensuite, je voudrais voir, obtenir moi le premier dans les listes de notre chambre est égal aux chambres disponibles. Tout d'abord, le premier de la liste. Et puis je vais prendre cet appel de méthode parce que oui, j'ai besoin de l'objet de réservation de chambre, qui fait vraiment un travail fantastique de tout cela. Mais à la fin de la journée, j'ai aussi besoin de mettre la nouvelle pièce d'identité, qui serait là. Donc, je vais dire donnez-moi la chambre à la recherche des demandes par lui-même. Donc, la réservation de chambre var est égale à créer les objets à la recherche de la pièce. Et puis l'ID de la chambre de réservation de chambre est égal à la chambre que nous avons. On y va. Et puis on économise ou on cherche de la chambre. D' accord. Alors avec tout ça, Helen et laissez-moi revenir en arrière et relancer les tests. Et maintenant, nous avons du vert. Tellement occupé parfois les exigences arrivant déjà manquer quelque chose. Il pourrait avoir à faire un addendum à un test existant et vous rangez tout comme vous le devez. Donc c'est vraiment tout pour cette activité. Il n'y a rien à refactoriser, rien du tout à refactoriser. Nous venons de modifier l'une des assertions et modifier le code pour nous assurer que cette assertion est vraie. Et c'est vraiment ça. Il suffit de modifier nos données de test et cette exigence n'est pas remplie.
14. Test et mise en œuvre : Rendez le résultat de réservation réussie ou en l'échec: D' accord, donc notre application va bien arriver. Nous avons vérifié toutes nos tâches au fur et à mesure. Et nous avons donc quelques couches. Donc, celui sur lequel nous allons travailler non est le succès du retour sur les résultats. Très bien, Donc, chaque fois que nous soumettons une demande avec les résultats qui sont retournés à partir du code, nous devons voir une fleur pour savoir si elle a réussi ou non. Non, en sautant au test, j'ai déjà fait le talon de la méthode. Et avant d'aller plus loin, je vais montrer,
vous savez, le concept de tests basés sur les données. Donc, les tests basés sur les données nous permettent de réellement, au lieu de se moquer et de mettre en scène des données dans la méthode, nous pouvons réellement mettre des paramètres et ensuite nous pouvons les alimenter. Donc, la première étape d'un test basé sur les données est de ne pas utiliser livre pour utiliser la théorie. D' accord, donc c'est notre nouvelle annotation. Et puis nous avons des données en ligne, ce qui nous prend alors de nombreux paramètres que nous fournirions pour le test. Donc, dans cette situation, nous voulons tester un scénario où nous avons un indicateur de succès. Et je pourrais étendre cela et dire le succès ou l'échec inondation. Très bien, parce que nous voulons indiquer si la réservation a été réussie ou non, et j'utiliserai une énumération pour cette constante. Donc je pourrais dire réservation, succès, drapeau. Et le type n'existe pas encore ceux-là, ceux-là font ça. Et le paramètre suivant serait, est disponible. On voudra savoir si l'inondation est cette valeur ? Quand c'est cette valeur. Donc, à peu près, ce sont les données que nous voulons sont le scénario que nous voulons positionner est basé sur ces deux valeurs. Donc, avant de passer à autre chose, laissez-moi juste créer ceci. Je vais juste créer ça dans les modèles. Ou vous pouvez le créer n'a pas de domaine, ou vous pouvez créer un autre dossier. Je pense que je vais juste créer un autre dossier et nous appellerons celui-ci énumère. Certains savent avec certitude si ce sera le cas. Et puis je vais juste ajouter une nouvelle classe appelée drapeau de réussite de réservation à cela. Mais c'est vraiment une énumération publique. Et cette énumération va avoir à ce qui est le succès et l'échec. D' accord ? Donc c'est encore une fois juste des trucs comme la mer. C' était un succès de réservation ou c'était un échec de réservation. Bon, donc non, je peux sauter pour tester et inclure la référence manquante pour l'énumération. D' accord, donc pour les données en ligne, je peux voir les réservations, le
succès, le drapeau, l'échec, le coma. Donc ça devrait être un échec quand c'est faux, non ? S' il n'y a rien disponible, alors ça devrait être faux. Et puis je peux voir le succès quand c'est vrai. Donc, ceux-ci présentent des scénarios de données, donc le test à l'avance. Donc, quel que soit le code que nous écrivons, il déduira automatiquement les scénarios basés sur ce que nous fournissons ici. Et bien sûr, les paramètres fournis dans les données en ligne
iront conformément aux paramètres tous alignés pour la méthode. Donc, pour le test lui-même, je vais juste écrire du code qui est assez générique pour l'un ou l'autre scénario. Si vous voulez tester quand ce n'est pas disponible, je vais vouloir vider mes chambres disponibles, non ? Donc, ce sont nos données de test. Et bien sûr, si je teste quand il n'est pas disponible, alors je veux répliquer cette ligne. Alors voyons. Si ce n'est pas disponible. Ensuite, exécutez cette directive. Effacez les chambres disponibles. D' accord. Ensuite, je vais dire les résultats var, que nous savons que nous obtenons quand nous appelons notre processeur. Réservez la demande. Donc, je vais juste copier et coller cette ligne. Nous savons qu'il renvoie nos résultats. Nous sommes donc à peine testés, il y a des situations où nous n'avons pas eu à obtenir les résultats pour nos affirmations et il y avait des situations où nous devions obtenir du crédit. C' est très bien. Donc, dans cette situation, le résultat
var est égal à appeler la requête. Et puis je vais voir que le,
le point d'inondation de succès de réservation devrait être et il devrait être à tout moment égal au code. Donc r pour inonder le dollar incent par les résultats. Donc, le drapeau n'existe pas encore, donc je vais juste au point de contrôle le laisser générer la propriété à l'intérieur de cette classe de résultats pour nous. Et puis, ce que nous pouvons faire est de sauter là-bas et de changer cette propriété et de s'assurer que c'est ce que nous attendons à ce qu'elle soit. Et le voilà, drapeau du succès public. D' accord, donc c'est maintenant une partie des résultats. Je vois que le test va déduire ou affirmer plutôt cela à
n'importe quel moment, quelle que soit la situation dans laquelle il est présenté. Si ce n'est pas disponible, nous éclairons et ensuite nous essayons d'obtenir le résultat. Donc, le succès de la réservation devrait être égal à cela. Tout ce qui est fourni sur ce bord doit être
conforme à ce qui est retourné des résultats. Donc je vais juste faire une construction rapide juste pour m'assurer que tout va bien. Et une fois que vous aurez vérifié ça, je vais lancer ça. Et l'explorateur artistique nous fait savoir que ça a échoué et c'est bon. Donc si vous remarquez quand j'ai laissé tomber cette carotte, ça montre deux tests imbriqués sous le talon d'une méthode, non ? Vous montrant le premier scénario de test. Donc, le premier scénario, qui est le scénario où il devrait retourner le succès. Donc, par défaut, je n'ai rien fait mais la valeur
enum va toujours par défaut au premier dit par défaut au succès. D' accord ? Et puis le scénario d'échec n'est pas en cours d'
exécution parce que vous voyez ici l'indicateur de succès de réservation devrait être le succès. Les deux étaient un échec, non ? Donc maintenant, nous devons mettre du code pour nous assurer que tout cela fonctionne. Donc, dans notre processeur, nous y allons. Nous devons renforcer cette déclaration si un peu plus. Donc, à peu près, je devrais lui faire savoir que le résultat, rappelez-vous, retourne les résultats. Nous allons donc construire les résultats manuellement. N' entendez pas. On vient d'ajouter cette inondation. Nous devons donc être en mesure de déterminer quand le flux devrait être, quelle valeur, n'est-ce pas ? Donc, je vais, au lieu de revenir juste là, je vais construire le résultat à partir de ou à quelqu'un pour dire que le résultat est égal à. Parce que quel que soit le résultat, nous savons qu'un résultat doit avoir ces valeurs. Donc, nous savons que déplacer ce refactor ne devrait pas jouer un rôle énorme dans le comportement du code différemment. Cependant, au moment où une réservation est sur le point d'être sauvegardée, nous savons qu'une fois qu'elle a été sauvegardée, je peux voir que le drapeau de points des résultats est égal à la réservation, le succès, le succès. D' accord ? Donc, s'il y a des chambres disponibles, nous faisons ce que nous avons fait avant et nous avons mis le drapeau. Sinon, nous allons lui dire qu'il a échoué. Donc, le succès, désolé, le drapeau saura, disons l'échec. D' accord. Appeler ce drapeau de réussite de réservation est un peu trompeur. Alors je vais changer ça. Donc, au lieu de réserver avec succès, je vais l'appeler indicateur de résultat de réservation. C' est plus générique. Donc, ce contrôle points et laissez-le mettre à jour toutes les références dans tout le code. Et ça a l'air beaucoup mieux. Donc, à la fin de cette opération, nous allons juste retourner le résultat. Nous avons donc construit les résultats dès le début, puis nous avons fait notre logique métier. Et puis je mets ceci après le sauvé parce que si ce champ alors clairement qui aurait pu être un succès. Sinon, c'était un échec. Et puis nous allons de l'avant et retournons le résultat. Donc, si je relance ce test et que je vais juste faire à partir du talon moyen, alors j'ai des tiques vertes tout autour, ok, gentil et facile. Alors que nous mettons dans nos tests, nous mettons en œuvre, et plus important est le fait que nous pouvons faire des théories ou des tests
basés sur les données où nous fournissons les scénarios. Et au lieu de vous écrire des déclarations pour dire si cela alors que si cela alors que les statistiques, beaucoup de choses, nous pouvons écrire un test qui s'intégrera dans les différents scénarios que nous attendons à sortir de notre méthode.
15. Test et mise en œuvre : Ajouter un d'adresse de réservation pour le résultat: Nous sommes donc de retour pour un autre exercice et cette fois nous voulions juste
ajouter le numéro de réservation de la chambre au résultat. Donc, jusqu'à maintenant, nous avons l'ID de chambre ajouté au résultat, qui signifie oui, j'ai réservé cette chambre. Cependant, nous ne voulons pas avoir l'ID de l'enregistrement qui a été réservé. D' accord. C'est très bien. J' ai donc déjà mes méthodes. Notez aucune annotation car je veux vraiment que celle-ci soit pilotée par les données. Donc je vais avoir deux paramètres. Je vais dire une chambre, une réservation, des idées, un entier. Et basé sur s'il y a quelque chose de disponible que cette valeur pourrait changer, non ? Donc, je vais faire la même chose ici où j'ai booléen est disponible. Donc je vais réutiliser ma théorie. Et je vais juste copier et coller les deux en lignes. Qu' est-ce évidemment la connexion de données. Disons donc ce qui nous permet de voir ce qui se passe. Je m'attendrais à ce que peut-être un ID d'un serait donc l'ID de réservation de chambre quand il est vrai que quelque chose est disponible. Cependant, si rien n'est disponible, comment n'attendez-vous rien pour la valeur de l'ID ? Et ce serait faux. Oh, j'adore le changement de mon type de données ici parce que je vois null, mais cela peut prendre un nez après le rendre nul, non ? Donc ils diviseront notre point d'interrogation là qui le rend nul et alors c'est bien. Donc encore une fois, à cause de mon scénario, s'il n'y a rien disponible, alors dégagez la pièce. Donc, pour le scénario où est disponible est faux, puis effacer la liste des chambres disponibles. Sinon, je veux configurer ma méthode de sauvegarde. Donc je vais juste revenir à l'endroit où on a testé le tamis. On y va. Je vais vraiment emprunter ça. Je ne vais pas le retaper, juste ennuyeux toute cette configuration. D' accord ? Et au lieu de tout ce que j'ai fait là-bas, je vais enregistrer Booking dot ID. Donc, je suis parti pour ajouter ce paramètre d'ID à la classe de réservation parce que évidemment il n'y a pas encore d'ID pour cela. Et cette pièce d'identité devrait être égale à ce que je passe dans l'ID de réservation de chambre, valeur point. D' accord. Donc je vais juste contrôler les points. Laissez-le générer cette propriété. Et je sais que nous aurons l'idée et la pièce d'identité. Donc, si vous êtes méticuleux, vous pouvez réorganiser ceci et placer Idea au-dessus de l'ID de la chambre. C' est bon, mais ça ne fera pas fonctionner le code plus ou moins. C' est juste une question de lisibilité, mais c'est bon. Je vais le laisser tel qu'il est. Donc, c'est la configuration pour le C lorsque nous testons pour le scénario, vrai. Donc, si elle n'est pas disponible ici, les chambres, sinon, aller de l'avant et installer sur. Attendez que cet ID soit égal à la valeur. Donc, après tout cela est fait, je dois aussi faire une représentation dans le résultat pour l'ID de réservation de la chambre. J' ai donc besoin d'avoir une carte d'identité publique de la chambre. Droit. Maintenant, notre OCT sur l'affirmation dans notre méthode de test sera similaire à ce que nous avions précédemment où nous effectuons l'appel à résultat, et ensuite nous affirmons que l'ID de réservation de chambre des résultats devrait être égal à la réservation de chambre que a été transmis. Maintenant, il y a un problème ici et
on voit que dans ne contient pas une définition pour devrait être. Ok, nous savons que ce n'est pas vrai, mais je pense que c'est juste un type de données en question parce que c'est un int nullable, alors que celui-ci est juste int. Laisse-moi rendre la carte d'identité de réservation de chambre nullable. Et on y va. D' accord. Donc, je fais cela nullable parce que dans le cas où quelque chose n'est pas disponible, alors l'ID de réservation va
être l' ID de réservation de chambre ne sera pas de toute façon, non ? Donc, je fais juste nullable qu'un résultat sait qu'il n'a pas nécessairement besoin d'avoir une valeur à tout moment. Alors faisons les tests rouges. Alors laisse-moi courir. Je ne l'ai pas remarqué en disant qu'il y a deux scénarios qui n'ont pas encore été exécutés. Encore une fois, ces tests sont considérés comme des tests multiples en une seule séance. Bon, alors laissez-nous passer à notre code. Donc, ce serait dans le processeur de réservation de chambre et PR trop. Ce que nous allons faire, c'est ajouter à cette zone. Ça donne des points. ID de réservation de chambre obtient la valeur de n'importe quel identifiant de point de réservation de chambre devient. Très bien, donc à ce moment-là, il obtient cette valeur. Donc, vous voyez que test.py testait la tête de scénario null. Laisse-moi revenir aux tests. Donc, il analysait le scénario null où c'est nul et c'est faux. Donc, ce serait vraiment arrivé cette nuit-là Charlie, parce que nous n'avons pas de valeur pour la carte d'identité de la chambre. Il est nullable. Et donc null est automatiquement être un centre est tout dot room ID de réservation dans cette situation. Donc nous devons nous assurer que celui-ci passe. Donc, quand nous retournerons et recommencerons nos tests, alors nous verrons que nous recevons un test écologique. D' accord. Donc, sachez notre affirmation que le numéro de réservation de chambre, c'est son retour devrait toujours être similaire à la valeur qui a été fourni. Donc, au moins un est fourni, puis l'ID de réservation de chambre revient comme un seul lorsque les connaissances fournies, il revient comme un tout. Donc c'est bien. Donc, laissez-moi juste faire une construction et nous n'avons rien d'autre à faire aucun changement majeur, donc nous n'avons rien à refactoriser trop. C' est donc cela pour répondre à ces exigences.
16. Examen de la section: D' accord les gars, donc on peut cocher toutes les cases à cocher en toute confiance, retirer toutes nos cartes qui ne le font pas. Et nous voyons que pour ces exigences préliminaires, nous avons implémenté des tests et nous avons écrit du code, et nous avons une bonne couverture de code pour les fonctionnalités de base de notre application. Donc, tout cela est fait pour l'instant. Nous avons donc terminé les tests unitaires pour le noyau de l'application. Non, bien sûr, il y a beaucoup plus de travail à faire. Quand nous reviendrons, nous devrons terminer les implémentations de nos méthodes d'interface,
car clairement, il n'y a rien qui se passe vraiment ici. Et pour l'instant, c'est toujours en théorie. Mais le but du développement piloté par les tests est que vous pouvez réellement avoir une bonne idée de la conception de l'API, de
la conception globale de l'application ou de la conception logique de l'entreprise. Avant d'entrer dans la viande de ce qui doit vraiment se passer, vous pouvez filer toutes vos classes devraient regarder et comment elles se rapportent les unes aux autres dès le début. C' est ce qu'on a vraiment fait. Donc plus tard, nous examinerons la connexion à la base de données et l'écriture de tests unitaires. Vérifiez que les opérations de base de données se comportent de la façon dont nous les attendons, puis dépassez cela en test de l'application complète. Mais pour l'instant, laissez-nous simplement piéger nos changements. Et mon message de validation est terminé le noyau d'application de test unitaire. Nous pouvons tout engager et couler. Et quand nous
reviendrons, nous regarderons plus d'activités.
17. Projet Refactor pour la couche d'accès des données: Très bien les gars, bienvenue. Dans cette leçon, nous voulons parcourir les étapes à suivre pour configurer nos couches d'accès aux données. Et cela va impliquer un certain refactorisation et une réorganisation de nos projets. Si vous regardez mon explorateur de solutions, vous verrez que j'ai quelques nouveaux projets et que certains fichiers sont dans de nouveaux endroits. Et je vais vous guider étape par étape. Je ne voulais pas le faire à la caméra parce que nous savons tous comment créer des projets. Donc je vais juste vous guider et vous pouvez faire une pause et vous reproduire au fur et à mesure que nous avançons. Mais tant que vous regardez à travers et que vous le faites étape par étape, ils ne devraient pas avoir de problème majeur. Commençons donc avec les nouveaux projets qui ont été ajoutés. Nous avons ajouté le domaine Up, donc la salle groupage vers le haut domaine de points, c'est son propre projet. Nous avons également ajouté la réservation de salle jusqu'à la persistance de points de ces deux, je viens de bibliothèques de classe. Et si vous vous souvenez, la pièce qui regardait vers le fond n'était qu'une bibliothèque de classe. Ainsi, les mêmes règles que vous utilisez pour gouverner la pièce regroupant le noyau, vous pouvez réutiliser celles pour le domaine et la persistance. Et puis nous avons ajouté une autre pièce de projet de test x unité regroupant la persistance des points. Droit ? Vous pouvez donc aller de l'avant et ajouter ces trois projets à votre solution. Maintenant, en termes de réorganisation des fichiers, ce que nous avons fait était de prendre le dossier de domaine ou le serveur de
fichiers dans le dossier de domaine et de le placer à l'intérieur des projets de domaine. Donc, je me suis débarrassé du dossier pas avant cependant. Bien sûr, j'ai attrapé les fichiers et les coller à l'intérieur des projets de domaine. Donc, les revêtements aussi faciles que de cliquer sur le fichier
que vous voulez et que vous utilisez Control X aller dans le projet vous voulez et dire Control V. Donc c'est tout ce que j'ai fait pour les couper et les coller dans le projet de domaine. Le mouvement majeur suivant a été le mouvement de la base de réservation de chambre, non ? Alors rappelez-vous que nous avions la classe de base de réservation de chambre elle-même, le dossier des modèles. Je l'ai sorti et l'ai mis dans son propre dossier dans la classe de domaine appelée modèles de base. D' accord ? Maintenant, bien sûr, cela bouleverserait beaucoup de ce que nous avons en place parce que les espaces de noms doivent être modifiés et nous devons mettre en utilisation supplémentaire. Ainsi, les modifications d'espace FirstName se sont produites avec les fichiers qui ont été déplacés. Donc, la chambre, la réservation de chambre et la base de réservation de chambre ont tous obtenu un nouveau domaine. Désolé, noms d'espace de noms sous la forme de réservation de chambre, domaine de
point Pour la réservation de chambre
et de chambre, puis réservation de chambre cette chambre réservant dot domain dot based models. Donc, avec ce changement, supprimez en fait certaines des erreurs qui auraient été attendues. Donc, vous devez d'abord laisser ce projet, ni qu'il ait un projet ou une référence au projet de domaine. Vous pouvez le faire de deux façons. Soit vous allez, j'utilise le point de contrôle et vous verrez
effectivement cet ajout pour ajouter la référence de base. Mais si vous vouliez prendre les choses entre vos propres mains, vous pouvez toujours cliquer avec le bouton droit de la souris sur les dépendances, ajouter une référence de projet, puis assurez-vous juste que vous prenez la moyenne. Donc, une fois que cette référence de projet est présente, nous pouvons maintenant contrôler dot et ajouter les instructions using n'importe où qui a été offensé par le changement, n'est-ce pas ? Ainsi, vous pouvez simplement parcourir chaque fichier méticuleusement et vous assurer que nous mettons à jour les références sur les autres. Utilisez la touche Contrôle pour nettoyer au fur et à mesure que je vais. Et dans notre processeur sait que ce serait un fichier très bouleversé parce que c'est là que beaucoup de l'action a eu lieu. Donc, utilisez simplement des points de contrôle qui utilisent des instructions. Et partout où ce n'est pas satisfait. Il suffit de contrôler le point, les points de contrôle. Et avec quelques-uns, ça devrait l'être, tout devrait aller bien. Assurez-vous donc que vos espaces de noms sont corrects et que vous mettez à jour toutes les références au fur et à mesure que vous allez dans le test. Donc, je suis sûr que nous allons en avoir quelques-uns que nous devons mettre à jour aussi. Donc, contrôlez le point et mettez à jour les nouvelles références d'espace de noms. Et avec un, tout va bien pour moi dans ce test. Donc c'est l'opération avec le domaine. Bon, donc tu peux aller de l'avant et mettre en place ce président de la persistance et tout ça en ajoutant un dossier appelé dépôts, qui est vide, non ? Pas de portable pour le remplir. Je vais le faire ensemble, mais nous le ferons ensemble. Mais pour le contexte DB, ce que j'ai fait est d'ajouter une référence à Microsoft en tant qu'Entity Framework Core point SQL Server. Donc, vous pouvez soit le mettre dans le projet pour le XML ou bien sûr, nous utilisons de nouveaux obtient vous juste un clic droit. Accédez à Gérer les packages NuGet et vous pouvez
rechercher SQL Server et installer cette bibliothèque. Donc, une fois que vous avez installé cette bibliothèque. Lorsque nous configurons notre contexte DB. Et j'ai encore un vote offensant ici, pas de problème, Points de
contrôle et ajouter les instructions d'utilisation. Bien sûr, les projets de persistance auront également besoin d'une référence au projet de domaine. D' accord, donc une fois de plus, assurez-vous d'avoir cette dépendance de projet. Donc, si le contrôle Dot n'a pas suggéré que c'est vous voulez faire à soi-même, il peut aller directement nous frapper pour le reste du dossier et voir ce que nous avons fait ici. Donc, un, nous ajoutons la référence à l'utilisation pour Entity Framework Core après que nous avons laissé notre salle publique rechercher des contextes DVI hériter des contextes DVI. Ensuite, nous avons notre constructeur. Et rappelez-vous qu'un raccourci pour les constructeurs, voir tar tub, tub épopée échoue parce que voir TOR rempli là-bas cependant. Vous pouvez donc toujours le faire et générer votre constructeur. Et à l'intérieur de ce constructeur, nous avons les paramètres DB, options de
contexte salle regroupant les contextes et les options Didi. Et puis nous devons les transmettre à la base. D' accord ? N' a pas besoin de contenu. Assurez-vous juste d'avoir ce constructeur. Pour nos tables ou ensembles RDB. Ce que nous avons serait DB ensemble de type chambre pour les chambres, DB ensembles de type réservation de chambre pour les réservations de chambre. Et puis nous avons notre protégé sur à vide sur la création modale ModelBuilder, n'est-ce pas ? Donc, pour cette méthode où religieux écrasant un raccourci pour arriver à se retrouver avec un peu de simplement plonger override et puis l'espace. Et puis il vous donne toutes les méthodes que vous pourriez sur son modèle de sérotypage mis en évidence, puis vous verrez apparaître sur la création du modèle. Donc c'est une bonne chose que la méthode sache ce que nous faisons à l'intérieur de cette méthode. Stub. Tout ça annule tout ça. Ce qu'on fait dans cette méthode, c'est semer des données, non ? Donc, je vois juste la salle d'entité point ModelBuilder a des données et ensuite nous ajoutons juste trois nouvelles chambres. Alors vous verrez que j'ai une pièce d'identité et un nom. Donc, avant ce nom n'existait pas. Tout ce que nous avions dans la pièce était une pièce d'identité, donc vous pouvez simplement sauter dans la chambre et ajouter cette propriété de nom. Pas de problème. Après avoir ajouté cette propriété de nom, vous pouvez aller de l'avant et lui donner un nom. Vous pourriez dire nom, vous pourriez dire description de tout ce que c'est. Nous voulons juste des exemples de données et vous savez, pour le rendre un peu plus sensible, ajouter un peu plus comme notre application est en train de se réunir. Non, en termes de clés étrangères, nous avons certainement besoin d'ajouter une référence de clé étrangère, qui dans la pièce et la pièce regardant à l'intérieur de la pièce sera roi pourrait OS. Donc je vais juste réarranger ça rapidement. Je vais dire l'ID de la chambre, mais je vais aussi ajouter la propriété de navigation de type room et l'appeler chambre. Et cela servirait à lui faire savoir qu'il s'agit d'une période clé étrangère. Donc Entity Framework Core est assez intelligent pour savoir qu'il s'agit d'une clé étrangère. Si vous voulez en savoir plus en profondeur des choses, un trou de boulon Entity Framework Core fonctionne et comment votre base de données modèle est subtile clés étrangères et ainsi de suite. Vous pouvez consulter mon cours, Entity Framework Core, une visite complète. Donc, je n'irai pas trop en profondeur avec les configurations et toutes les possibilités d'Entity Framework ici. Au lieu de cela, nous allons rester assis sur nos couches
d'accès aux données afin que nous puissions commencer avec nos projets, n'est-ce pas ? Donc, à ce stade, je veux mettre dans le dépôt. Donc ce dépôt, bien sûr, ou peut-être que je devrais appeler ces services en fait des services de données, n'est-ce pas ? Et puis on pourrait renommer ça en services de données si vous voulez. Je veux dire, il y a tellement de façons qu'il peut renommer. Parfois, vous nommez un nom, un nom, puis vous rencontrez des problèmes. C' est ce que je pense que je vais appeler ça des dépôts. Parce que vraiment et vraiment, même si nous appellerons cela des services de données, ne
sont que des référentiels pour les fonctions. Et il l'a fait, je vais ajouter un nouveau fichier. Et j'interdis juste le nom là. Donc, je vais ajouter une nouvelle classe. Et je voulais l'appeler service de réservation de chambre. Juste avec tout le moi, d'accord. Ajoutons ça. Et je suis allé rencontrer cette classe publique et il va hériter du service de réservation de chambre i. Donc, cela signifie que j'ai besoin d'une référence de projet au noyau. Et je vais le faire et l'instruction using. Et puis la prochaine chose importante est qu'il doit implémenter l'interface. Bon, maintenant nous avons nos méthodes de mise en œuvre. Bien sûr, nous avons encore la méthode achetée, pas la mise en œuvre réelle, n'est-ce pas ? Donc une fois de plus, si vous vouliez voir comment cette marge d'héritage peut vous aider, vous verrez les marqueurs bleus qui entendent à ma gauche. Et si je clique, je peux passer au fichier principal. C' est donc un moyen rapide de naviguer entre les fichiers et leur apparence car c'était ce dont ils héritent, non ? Donc, c'est vraiment ça pour null pour, pour configurer les couches d'accès aux données. Eh bien, encore une fois, si vous avez besoin de passer en revue, pause et passer par, voir exactement ce que je suis d'humeur où et, vous savez, vous pourriez avoir de légères variations de certains
des noms que vous avez utilisés pour votre projet par rapport à votre dossiers. Et c'est bon, non ? Tant que l'idée générale de pourquoi toujours diviser cela est là. Et c'est relatif au changement. C' est philosophique au mieux. Mais tant que vous comprenez où nous sommes, ce qui doit aller et l'ensemble sa variance et obtenir les références plutôt que ça devrait être bien. Je vous verrai la prochaine fois quand nous lirons notre premier test d'intégration.
18. Test unité : Récupérer les chambres disponibles: Bienvenue les gars. Nous sommes un audacieux à lire ou les premiers tests d'intégration ou test
unitaire par rapport aux fonctionnalités attendues de l'Entity Framework. Donc, nous sommes déjà configurés ou contexte DB et nous
aurions installation ou d'autres projets dans le projet de test, j'ai créé un fichier ici, tests de service de réservation de
chambre. Donc, vous pouvez aller de l'avant et ajouter ce fichier de classe. Bien sûr, rendez-le public. Et puis à l'intérieur de ce fichier, nous allons avoir notre première méthode. Donc, il est vide public, devrait retourner les chambres disponibles. Donc, bien sûr, nous devons le décorer avec nos attributs et à toute déclaration d'utilisation pour que cela se produise. Maintenant, nous pouvons commencer nos arrangements. Donc, si nous revenons à notre code pour notre processeur, se
souviendraient que pour nous obtenir les chambres disponibles, nous devions passer la date de réservation de la demande, n'est-ce pas ? Donc, pour que nous puissions tester par rapport à la base de données, nous devons simuler ce que la base de données aurait besoin de savoir si quelque chose est disponible. Donc, d'abord battu hors de la gamme serait de dire var est égal à savoir le temps. On peut juste mettre un peu de temps d'essai, n'est-ce pas ? Donc, je vais mettre dans la date d'aujourd'hui qui est 2021, 0 six virgule 09. D' accord, et ensuite je vais sauver nos options. Donc, il ne fait aucun doute que nous avons besoin d'une instance de notre base de données. Nous allons devoir initialiser les options que nous pouvons transmettre dans le contexte de la base de données. Alors rappelez-vous que c'est notre contexte a le constructeur qui recherche quelques options,
paramètre des options de contexte
de type db et relatif à la pièce cherchant des contextes EV, non ? Donc, je dis juste que les options var sont, vous pouvez voir les options DB ou les options de contextes que vous devez nommer ceci. Donc, je vais dire que les options de base de données var sont égales à une nouvelle instance de nouveau constructeur d'options de contexte DB par rapport à la réservation de salle dans les contextes DVI. Et nous avons les parenthèses et nous ajoutons point, utiliser la base de données en mémoire. Maintenant, en cours de route vont devoir ajouter quelques références tout en, et vous allez devoir ajouter la référence du projet à la persistance, n'est-ce pas ? Donc, une fois de plus, vous cliquez sur les dépendances. Allez-y et ajoutez de la persistance. Et un autre que vous allez devoir ajouter est
un à Entity Framework Core en mémoire, que vous pouvez obtenir via NuGet. Donc, vous faites juste un clic droit beaucoup d'argent et vous obtenez des paquets. Vous pouvez en fait simplement le chercher en mémoire. Et vous devriez le trouver assez facilement. Et en l'installant et moi, vous obtenez tous les autres et les bibliothèques Framework Core qui sont nécessaires. Donc, vous pouvez simplement aller de l'avant et ajouter ces deux références. Et vous devriez vous débarrasser de toutes les lignes rouges qui se rencontrent ici. Bien sûr, vous devez vous assurer que vous avez l'instruction d'utilisation appropriée au fur et à mesure que vous allez. Donc, ici, nous voyons utiliser la base de données en mémoire, et c'est la base de données que je vais utiliser. Un de plus serait des options de point. Très bien, donc ce sont nos options DB que nous construisons pour la base de données en mémoire, qui n'existeront que aussi longtemps qu'il sera nécessaire pour effectuer le test. D' accord, donc c'est bon. Non, dans le contexte de la plage, juste la même chose. Nous voulons un exemple de contextes. Je voulais donc voir les contextes VAR en utilisant le contexte var. Donc, cela signifie fondamentalement nous crée la portée où vous avez un contexte étant égal à une nouvelle instance de notre réservation de chambre. Contextes bébé, qui se souviennent prend un paramètre d'options, je lui donne les options que nous venons de créer, qui sont les options DB. D' accord ? Et puis à l'intérieur de ce bloc utilisant, nous allons l'ensemencer avec des données temporaires juste pour la durée de vie de ce test. Donc, je voulais dire contextes dot add. Et vous pouvez simplement ajouter une nouvelle entité de tout ce qu'il reconnaît, non ? Donc, dans les anciennes versions d'Entity Framework Core, vous devriez probablement être des contextes plus spécifiques. La table qui sera des chambres, Points impair. Mais dans les nouvelles versions, vous pouvez simplement dire des contextes dot-dot-dot, puis vous lui donnez un objet qu'il connaît, il sait. Donc, vous chambre. D' accord. Allez-y et ajoutez la référence. Donc, j'ajoute une nouvelle pièce et je peux lui donner un ID égal à 1. Peut-être que si tu veux, tu peux lui donner un nom. Et cela dépend de la granulaire ou de la quantité de détails que vous voulez dans le test. Donc je vais juste dire chambre 1, puis point-virgule. Donc je peux en ajouter trois, non ? Tibia d'entre eux en conséquence. Donc ce sont les trois échantillons que j'ajoute. Et puis je vais ajouter aux relevés de réservation pour nos chambres. Donc pour ça à Dan 14 la veille. D' accord, donc les contextes dot-dot, nouvelle carte d'identité de réservation de chambre est égale à un. Donc cette chambre a été réservée aux dates que nous avons préparées. D' accord. Et puis la chambre voisine a été réservée la veille ou le lendemain, quelle que soit la valeur que vous voulez faire. Mais pour celui d'aujourd'hui, un seul devrait l'être. C' est le scénario que je crée. Bien sûr, c'est à vous de décider. Que voulez-vous faire dans votre scénario de test, n'est-ce pas ? À la fin de tout cela, nous allons juste faire un point de contexte de sauvegarde des modifications pour nous
assurer que la base de données reçoit les données qui y sont validées. Et vous remarquerez que je me suis débarrassé des accolades, non ? Ils ont donc suggéré que nous utilisions juste des points de contrôle et fait la suggestion et le changer en une instruction using pour le contexte. Et puis nous pouvons aller de l'avant et écrire tout notre code. Donc, cela résume vraiment pour la gamme de la base de contexte DB doivent également organiser un objet
du service ou un fichier de dépôt pour être appelé service de réservation de chambre de sorcière. Donc, le service de réservation de chambre doit pouvoir
parler à la base de données pour être en mesure de mener à bien son fonctionnement. C' est pourquoi, dans le service de réservation de chambre, nous sommes allés de l'avant et nous avons injecté ce contexte. Si nous ne sommes pas tout à fait sûrs de la façon de le faire, pour nous d'obtenir le CTO constructeur, notre baignoire, notre baignoire. Et puis nous mettons dans l'incidence de la pièce en regardant des contextes DVI, des contextes, puis des points de contrôle. Attribuez le champ et créez. On y va. Et puis utilisez le trait de soulignement, juste la clé appelée cohérente. Et c'est tout ce qu'il y a de l'injection. Donc non, même si les méthodes ne sont pas encore implémentées, nous avons un moyen de parler à la base de données à travers le contexte. Donc, dans notre arrangé et tout, nous devons initialiser une instance de ce service. Laissez-moi qualifier ce service de réservation de chambre. Droit ? Et le service de réservation de chambre est égal à une nouvelle instance de la classe du même nom, service de réservation de chambre, qui supprime le paramètre des contextes, qui dans ce cas est nos contextes DVI en mémoire. Donc maintenant, nous avons fini de nous arranger, il est temps pour nous de le faire. Donc, pour notre premier acte, nous aurons var, chambres
disponibles étant égales à notre chambre, service de
réservation, point, obtenir des chambres disponibles. Et nous transmettrons les données que nous avons préparées. Donc, sur toutes les chambres disponibles pour cela. Simplement un non offert, c'est alors pour les affirmations, tout ce que nous sommes allés pour affirmer. Donc, à ce stade, si vous voulez utiliser votre fluide, affirmez vos assertions fluides sont devraient poser nos assertions par défaut, Ce n'est pas un problème. Je veux dire, vous verrez comment ils fonctionnent tous. Donc, euh, ou du moins certainement une affirmation, l'affirmation par défaut fonctionne. Donc, à ce stade, vous pouvez vous sentir libre d'utiliser celui avec lequel vous êtes plus à l'aise. Ce que je vais utiliser l'affirmation par défaut cette fois. Donc, je suis allé affirmer que le cône de la pièce, des chambres disponibles pour cela, il devrait être le numéro X. Combien d'argent pensez-vous qu'il devrait être ? Donc, d'après le scénario que vous avez présenté, avez probablement une affirmation différente de moi. Mais je pense que ça devrait être deux, non ? Parce que, et puis cela va suggérer qu'un échange les arguments, non ? Donc à l'égal de ça. Donc, j'affirme qu'il devrait être au moins deux parce que j'ai des chambres un à trois et l'ID de chambre avec un est réservé pour qu'il soit l'ID de chambre 2 est réservé pour la veille, et la chambre ID3 n'a aucune réservation selon la base de données. Donc, au moins deux chambres devraient être disponibles. Alors que les affirmations que nous pouvons faire serait de nous assurer que les chambres que nous attendons d'être disponibles sont contenues dans la liste, juste. Pour que tu puisses affirmer les cantines. Quelles sont nos chambres disponibles ? Et puis contient non dirait me donner le type de données, ce qui est attendu et ensuite me dire ce que vous attendez à voir dedans ? Qu' est-ce que ces surcharges ne montrent que quatre chaînes, n'est-ce pas ? Alors voici, en voici une meilleure. Donc, la troisième surcharge montre en fait pour une collection innombrable. Et puis il faut un prédicat R, une de ces expressions Lambda comme filtre pour les comparaisons. Donc, en d'autres termes, je dirais l'expression lambda Q, qui représente l'une des chambres disponibles. Je pourrais dire que la pièce d'identité devrait être aussi, ou au moins les chambres disponibles devraient contenir quelque chose avec la carte d'identité deux. Droit ? Je pourrais faire la même chose pour les trois. Et je pourrais aussi affirmer ne contient pas l'assuré qu' il ne contient pas d'ID avec un ici. Nombre de choses que vous pouvez faire à ce stade. Si vous voulez, c'est vrai, désolé, c'est
un nom que vous auriez pu affirmer contre le nom. Donc c'est à vous de décider, mais ça fait artiste en ce moment pour s'assurer que nous avons des chambres disponibles. Et encore une fois, nous impliquons la pseudo-base de données glucose sont en train de créer la base de données, organiser, assis sur le dessus avec quelques exemples de choses. Et puis nous agissons sur l'affirmation. Alors faisons ce test. Et on sait qu'on va se faire lire. Mais nous allons au moins l'exécuter et nous assurer que notre syntaxe est correcte. Et quand nous sauterons à l'explorateur artistique, nous voyons toutes les tiques vertes précédentes, mais alors nous voyons que nous avons un nouveau projet de test et est vraiment connu à notre nouveau test, qui nous donne notre système pas mis en œuvre des exceptions. Donc, c'est bien. Donc, au moins, on sait que ça appelle nos contextes. Désolé, ça appelle notre service, notre dépôt. Et tout va bien sur ce front. Supposons donc, une fois de plus, que nous nous sommes arrangés, agis et affirmés pour ce test particulier. Parce que bien qu'il s'agisse d'un test différent, s'agit d'un test d'intégration où nous impliquons une configuration qui a ceux qui se moquent de notre mise en scène. Utilisons le staging orange où aucun système de staging, c'est-à-dire un système tiers parce que,
bien que le contexte existe dans notre base de données,
EF Core est une bibliothèque tierce bien que le contexte existe dans notre base de données, . Donc, nous sommes en train de mettre en scène ce que cette
troisième bibliothèque tierce ferait une circonstance normale avec notre base de données régulière réellement connectée. Nous n'avons pas encore ça, donc nous pouvons le simuler en utilisant celui en mémoire, lui donnant le nom. Donc, nous pouvons dire, ok, utiliser la base de données en mémoire, appeler que pour l'instant et construire ces options et dans le contexte donné par e, bien
sûr, si polyvalent qu'une fois que nous construisons des options, nous avons différentes extensions . Nous pouvons utiliser les options SQL, vous pouvez utiliser les options PostgreSQL. Dans ce cas, j'utilise en mémoire. Et certaines personnes utiliseraient les options de lumière SQL, n'est-ce pas ? Donc, le fait est que vous construisez les options et les contextes du créateur. Par rapport à ces options, vous volez les données dont vous avez besoin dans la base de données pour ce contexte, pour ce test. Et puis eucaryotes, protistes comme si vous
testez contre de vraies données qui devraient exister. Donc c'est comme une petite étape de la création d'une liste, n'est-ce pas ? C' est donc nos tests rouges pour cette activité. Quand nous reviendrons, nous mettrons en œuvre notre noyau.
19. Mise en œuvre : Récupérer les chambres disponibles: D' accord, les gars. Donc, nous avons juste écrit ou lu des tests pour nos chambres disponibles, appelées les chambres disponibles. Et j'ai déjà écrit le code et je l'ai fait juste pour que nous puissions passer ensemble. Mais c'est pour ça que tu vois que j'ai déjà une tique verte. Mais par tableau, j'ai annulé les changements. Donc je vais courir à nouveau et faire le test rouge. Et on y va. Donc, nous sommes sur parité nulle. Voyons donc comment nous pouvons mettre en œuvre cette citation. Donc, nous appelons la méthode obtenir des chambres disponibles. Quand je contrôle et F 12 va sauter
par-dessus et vous verrez l'exception non implémentée, qui est de quoi cela se plaint, et c'est bien. Donc, notre attente est que lorsque nous appelons cette méthode, donnez-lui une date, il va retourner des règles qui sont actuellement disponibles compte tenu des données qui sont demandées. Alors, de quoi avons-nous besoin pour revenir ici ? Nous devons nous assurer d'écrire une requête qui va refléter les données attendues. Donc, je peux dire var, chambres
disponibles est égal à notre contexte, points chambres. Donc, je peux regarder dans la table des chambres et puis évidemment besoin d'un filtre où expression lambda, comment aurais-je la chambre ? J' ai donc deux options. Je pourrais probablement regarder dans le je pourrais regarder dans les réservations de chambre. Australie, la réservation de chambre stable, où l'ADN est équivalent au chiffre actuel. Droit ? Mais alors comment puis-je savoir si je suis chanceux dans l'écurie de réservation de chambre ? Comment savoir quelles tables ne sont pas ? Droit ? Je suppose que je pourrais choisir la pièce elle-même. Donc Q point, point. Oui, on a la chambre, donc non, je sais quelles chambres sont réservées. Je devrais donc changer cela sur les disques disponibles. Donc, en fait, je fais ça. C' est comme mon processus de pensée habituel lors de l'écriture d'une requête plus ancienne,
quels sont les, quel est le plus facile que nous dérivons l'expression lambda pour obtenir les bonnes données ? Donc, je peux facilement trouver les chambres indisponibles, mais non, je dois trouver les chambres disponibles. Donc, je peux dire que var chambres disponibles est égal aux chambres de points de contexte, points où l'expression Q lambda, Q point ID de la pièce sont plutôt, je dirais où sur les chambres disponibles. Alors ils ont fait cette liste. D' accord. Donc, sur les chambres disponibles n'est pas de liste. Deuxièmement, voyez où la liste des points de pièces disponibles contient l'ID de pièce actuel équivaut à faux. Je fais ça exprès. Je vous montre le plus compliqué où vous avez probablement déjà compris pour
que vous puissiez l'écrire facilement et si vous avez des félicitations à vous, pas de problème. Je vous montre juste ce que pourrait être le processus de pensée. Certains voyant me chercher les chambres où les chambres indisponibles contiennent cela. Donc, j'ai effectivement écrit égal à faux à cause de la lisibilité, mais il pourrait aussi ne pas être continu, non ? Mais à des fins de lisibilité qui interagissent ou l'équivalent de faux. D' accord, et puis on obtient ça comme une liste. Donc, si je fais ça et puis retourne les chambres disponibles, alors théoriquement j'aurais obtenu ce qui n'est pas disponible, puis j'ai téléphoné à tous les durs toutes les chambres, ce qui est disponible en les voyant. Il n'est pas contenu dans la liste des indisponibles, alors s'il vous plaît le retourner et nous le retournons. Donc, je vais exécuter ce test et voir si ce morceau de code fonctionne. Et quand on regarde notre test, on voit que nous avons des lumières vertes. Ça marche, non ? Donc, comme nous l'avons fait, nous écrivons probablement le code d'une façon que nous obtenons le test pour réussir. Et puis nous disons, comment pourrais-je refactoriser ce code pour le rendre un peu meilleur ou quoi que ce soit, pour une raison quelconque. Donc, pour moi, c'est deux base de données parce que c'est un pour obtenir ce qui n'est pas disponible, alors voulez vérifier si la table a un off les watts n'est pas disponible. Et puis le retour de la balance, non ? Tout cela est vraiment parce que nous aurions pu définir certaines propriétés de navigation à l'intérieur des chambres, sont à l'intérieur de nos classes pour répondre à ce plus simple. Donc, les réservations de chambre ont déjà une obligation. Propriété quatre chambres. Donc c'est comme ça que nous avons obtenu cette clé étrangère, c'est ce
que nous allons utiliser l'infer qu'il y a une relation de clé étrangère entre la pièce et la pièce. Et c'est très bien. Maintenant, si nous regardons, c'est au niveau du type de relation. C' est vraiment un one-to-many, ce qui signifie que la chambre gagnée va avoir beaucoup de réservations. Donc oui, nous avons la relation de clé étrangère là-bas. Mais dans la salle, j'ai l'occasion et je
vais juste passer par là au cas où vous n'êtes pas familier avec Entity Framework Core, nous avons l'occasion de dire à la salle qu' elle peut s'attendre à avoir une collection. Et je vais juste utiliser des listes de réservations de chambres. Ainsi, n'importe quelle chambre peut avoir plusieurs réservations. D' accord. Et quand appeler les réservations pour représenter qu'il s'agit d'une collection. Donc, une fois de plus, Entity Framework, nous déduisons juste qu'une chambre, nombreuses réservations et une réservation à une seule règle. D' accord. C' est tout ce qu'on a en ce moment. C' est très bien. Donc, à l'intérieur de la requête, je peux réorganiser les sous-réseaux. Parce que dans mon esprit, je pourrais dire retour ou laissez-moi simplement dire obtenir les chambres disponibles. Je peux dire que var chambres disponibles est égal au contexte des chambres de points sont. Laisse-moi juste dupliquer cette ligne. Très bien, et en quelque sorte le faire à partir de zéro pour qu'on puisse voir tout ce qui se passe. Je vous montre juste toutes les options. Donc, ce n'est pas nécessairement que l'un fonctionne mieux que l'autre. Je veux dire, si vous voulez appeler le nouveau coût d'aller à la base de données plus d'une fois mieux que très bien. À la fin de la journée, il passe le test. C' est juste que le code pourrait être écrit d'une manière différente de faire une base de données appelée donc var chambres disponibles dans cette nouvelle déclaration. Var chambres disponibles, oui, est égal aux contextes points chambres que nous sommes, et puis mon expression lambda ici aurait Q point à travers les réservations. Bon, maintenant j'ai la propriété de navigation pour la réservation de chambre. Donc automatiquement Entity Framework dirait juste, je cherche une pièce, obtient toutes les réservations qui sont là que je peux voir sur cette collection et l'amplitude sur d'autres expressions lambda, je peux voir où il ya des réservations qui ont la date d'aujourd'hui ou la date demandée, donc ne soit égal au bit. Très bien, donc c'est une réécriture complète et cette ligne seule ou place, ces deux lignes. Donc, je pourrais vraiment enlever ça et puis juste retourner les chambres disponibles. Et puis si vous, si vous voulez l'écrire en encore moins de lignes, vous pouvez simplement revenir du début. Pas besoin de cette variable. D' accord, et je vais faire le test à nouveau parce que j'ai fait un énorme toit OK, mort. Condensé trois lignes de code en une seule ligne de code. Et puis je vais permettre à mes tests unitaires de me dire si mon refacteur a du sens et de l'accord. D' accord. Comme je reçois des commentaires, affirmer l'échec, il s'attend à un, Il n'en voit qu'un. Donc, en regardant
cela, c'est le problème que j'aurais dû dire est équivalent à faux, ce qui signifie que je cherche des chambres disponibles, non ? Alors donne-moi les chambres où ils ont des mots. Il y a des réservations avec la date. Et puis je vois des chutes sont il n'y a pas de réservations avec l'acte, donc c'est plus lisible pour vous. Alors donnez-moi des chambres où il n'y a pas de réservations avec les actes demandés. Alors réexécutons ce tissu. Donc, une fois de plus, vous voyez à quel point j'ai reçu des commentaires de notre refactor, je suis devenu trop zélé. Anna a dit : Oh, je peux faire ça en une seule ligne. Est-ce qu'il a échoué le test en une ligne ? Non. J' ai examiné ma seule ligne de code et je reçois un test vert. Donc, une fois de plus, il s'agit d'un processus de développement piloté par les tests. Vous écrivez votre test, vous écrivez votre code, vous refactorisez, vous retestez, et ECL rapidement. On fait tout ce genre de défilement. La raison en est que j'essaie de m'expliquer pendant que j'y vais. Et probablement mes monologues prolongent le temps passé à faire ça. Mais je veux juste m'assurer que vous appréciez
la valeur de la façon dont ces tests
nous donnent des commentaires en temps réel sur la performance ou la précision plutôt, sur notre code.
20. Test et mise en œuvre : Enregistrer une réservation de chambre: Très bien les gars, bienvenue. Donc, nous sommes en train d'intervenir et ce que nous allons faire est de faire nos tests d'intégration pour nous assurer qu'il va réellement enregistrer les données dans la base de données, n'est-ce pas ? Donc similaire à ce que nous avons fait pour, ou des contextes pour le devrait retourner les chambres disponibles. Parce que le contexte doit vivre pendant la durée de vie de l'opération. Nous n'allons pas faire un arrangement global comme nous l'aurions fait pour le test précédent,
désolé, pour le projet de test précédent où nous ajoutons une arange de toute façon, définissons une instance pour tout. Donc, dans ce cas, le contexte est un peu éphémère et il doit exister dans le contexte du critère. Donc on va faire l'arrangement selon, pas vrai ? Une chose que nous pouvons garder notre répétition à coup sûr serait les options RDB. Mais... Encore une fois, vous voudrez le garder unique. Alors rendez-la unique en lui donnant un nom différent, non ? Donc je vais à Nehemia et je devrais sauver les tests. Et après avoir assis sur les options DB, je vais créer un échantillon de réservation de chambre requis. Donc je vais juste dire que je vais réserver une chambre avec la carte d'identité à cette date. Et bien sûr, il y a d'autres domaines. Un bon remplissage dans l'email et le nom complet. Eh bien, vous ne mettrez pas l'ID parce que nous sommes sur voir si c'est un ne fournirait pas l'ID, mais vous pouvez mettre dans tous ces champs, mais d'autres gardent cela simple et mettent dans l'ID de la pièce et la date juste pour nos assertions. Bon, maintenant que nous avons ça, nous pouvons passer à l'autre. Tellement similaire à ce que nous avons fait ici avec nos contextes DVI. Je vais juste emprunter cette ligne et ensuite je vais initialiser mon service de réservation de chambre. D' accord. Et après l'avoir initialisé,
je peux dire que le service de réservation de chambre pensait sauver. Et je passe dans notre réservation de chambre que nous économisons correctement. Maintenant, après avoir fait semblant de sauver ROTC du ni dans la mémoire, il y a un certain nombre de choses que nous pouvons commencer à affirmer. Un. Nous pouvons affirmer qu'un seul enregistrement est entré dans la base de données parce que l'attente est que même lorsque nous faisons notre application, quand nous appelons save, un seul enregistrement devrait lire le goin. Comme à l'époque, je mets une réservation. Il ne devrait jamais avoir à enregistrer. Donc, nous pourrions effectivement simplement récupérer les réservations en voyant les réservations
var est égal à ou contextes, Points, réservations ou réservations de chambres. Listes de tri par points. Nous demandons donc d'obtenir MC, toutes les réservations qui sont actuellement dans la base de données. Alors on peut dire Var King, celui-là, la seule réservation qui est censée être là-dedans. Et je peux affirmer célibataire. D' accord. Donc j'affirme qu'un seul enregistrement devrait revenir. Donc, si vous passez le curseur sur un seul, vous verrez qu'il vérifie qu'une collection donnée
ne contient qu'un seul élément du type donné. Donc, je verrai un single venant des réservations. Très bien, Donc affirmez singlet, mais il renvoie aussi ce type. Donc c'est en dire un. Il doit s'assurer qu'il n'y en a qu'un là-dedans et que je vais le rendre. Donc, si cela échoue ici, alors vous savez qu'il a enregistré plus d'une fois et vous avez probablement un bug dans votre code où il commet probablement plus d'une fois au moment du CVE. Donc, après que nous obtenons le week-end de réservation ou des assertions, droite, Donc affirmer point égal et nous pouvons commencer à comparer l'enregistrement stocké, qui dans ce cas est la réservation avec l'enregistrement original que nous aurions envoyé plus. Donc, je peux voir affirmer chambre égale booking.com et la réservation, qui est ce que nous venons de récupérer de ce point point de collection. Affirmez que ces deux sont égaux. Indiquez également que l'ID de la pièce est égal. D' accord ? Et comme je l'ai dit, vous auriez pu mettre dans les champs de données pour l'email et le nom complet, et ensuite vous faites simplement vos affirmations en conséquence. Eh bien, c'est à peu près ce que notre test fait au cœur de tout ça pour le coffre. Et puis basé sur les différentes règles métier que vous pourriez avoir. À ce stade cependant, le service ne devrait pas nécessairement avoir de règles métier qui auraient dû être prises en charge du noyau, ce qui signifie qu'il ne devrait pas arriver à la mer de juste cycle met dans toutes les validations pour s'assurer que que nous devons avoir ce feu à moins qu'il ne remplisse certaines conditions. Donc, toutes ces validations devraient vraiment aller au de base ou au niveau de la logique métier. Mais à ce niveau, nous testons simplement ce que le B2B devrait faire. Disons que vous testez à ce stade est
vraiment basé sur le scénario du fait que vous transportez une requête de moteur. Une fois que vous effectuez cette requête, vous obtenez des résultats comme ce que vous attendez. Ce n'est pas le cas. Est-ce que la requête fait cela dans cette circonstance ne le sont pas ? Cela devrait se faire au niveau de la logique opérationnelle. Alors faisons nos tests, que nous savons que sera vert, désolé, sera débarrassé de me devancer là-bas. Donc, il construit un projet et puis Test Explorer va nous montrer des tests de lecture. Voilà, parce que ce n'est pas encore mis en œuvre et c'est très bien. Donc, je peux juste cliquer, sauter sur les tests. Et toutes ces méthodes sont vraiment besoin de faire est d'ajouter la réservation de salle au contexte et ensuite CVE, non ? Donc, je suis allé remplacer cela par des contextes ou des contextes de soulignement, point add. Et puis je peux juste dire qu'il avait une réservation de chambre. Et puis soulignez les changements de contexte. Et tout le monde devrait savoir si je fais le test à nouveau et que je vais courir. D' accord, donc vous voyez ici il y a cinq tests autour de cette méthode. Tous ces passés, moins dans le passé, ils étaient de bons tests et ce seul domaine. Donc, je vais juste exécuter tous les tests associés à cette méthode de tamis. Et voyons l'ancien com. D' accord, donc vous verrez qu'il a un peu sauté ce qu'il n'avait pas besoin de réexécuter, sélectionnez celui-ci avec le blanc et le vert. N' a pas été exécuté cette fois parce que ce n'est pas que les tests associés au CVE. Cependant, les cinq tests de la politique d'Arnold, y compris celle que nous venons d'écrire. Donc, c'est vraiment ça pour tester si Entity Framework va voir l'enregistrement. D' accord, souviens-toi que c'est ce qu'on fait. On fait un trou de test d'intégration. Est-ce que notre application interrompt avec le RM ou la bibliothèque qui est en charge de parler à la base de données ? Donc, c'est ce que nous avons testé une
fois de plus dans un travail différent, il est si facile pour nous de
simplement faire tourner une base de données pour les artistes scénario, puis de la supprimer par la suite. Donc, ces bases de données n'existeront jamais qu'une fois ce test exécuté. C' est donc vraiment tout pour nos tests d'intégration. Quand nous reviendrons, nous allons juste passer en revue tout à un niveau plus élevé, puis nous avancerons.
21. Examen de la section: Très bien les gars, donc c'est vraiment tout pour cette section. Nous avons ajouté un autre projet de test. Nous voyons donc dans notre solution que nous avons beaucoup de projets et certains d'entre eux doivent être testés. Certains n'ont pas nécessairement besoin d'être testés. Nous n'avions pas ce domaine parce qu'il ne s'agit que de stocker tous nos fichiers de classe qui seront ensuite transformés en entités pour la base de données. Nous avions ajouté une persistance qui va canaliser le dépôt ou le service de notre service de données, je l'appelle dossier des dépôts, mais j'appelle les services de fichiers. Pour qu'on puisse l'appeler comme ça. Vous pouvez le faire si vous avez une convention de nommage de bouton, c'est bon. Mais le concept est que la mise en œuvre du service de réservation de salle d'oeil. Donc, i service de réservation de chambre aura toutes les données liées méthodes stubs moins. Et puis ils seront mis en œuvre par le service de réservation de chambre, qui aura certainement le code concret. Donc, au moins quand nous étions Unittest dans le noyau, nous étions vraiment seulement des tests unitaires contre le service de réservation de salle d'oeil. Nos affirmations où je suppose que le renard que la méthode
aurait reçu un appel au moins une fois ou jamais basé sur les circonstances. Donc, par exemple, dans les demandes de réservation de salle de sauvegarde, qui verrait ici que nous vérifions
que la méthode de sauvegarde a été appelée au moins une fois, non ? Ainsi, lorsqu'il est fourni avec les données actuelles, sur la
base de la logique métier que nous aurions mis dans le processeur, cette méthode de service devrait être appelée au moins une fois. Maintenant, une fois de plus, le noyau est où nous avons implémenté et testé
la logique métier, les règles derrière quand il fait certaines méthodes appelle sur quelle circonstance il se comporte une semaine particulière, c'est très bien. Cependant, le tunnel des tests d'intégration se trouve sous la logique métier où nous
intégrons ou où nous testons les systèmes que nous intégrons dans cette situation. Nous nous intégrons à notre base de données via une bibliothèque appelée Entity Framework Core. Donc, nous testons pour nous assurer que lorsque nous appelons les méthodes qui font réellement le travail interdépendant ou le travail qui dans le noyau de travail différent se comporte comme nous voudrions qu'il se comporte. Bon, donc c'est ce qu'est un test d'intégration. Et à ce niveau, vous, c'est là que vous commencerez à tester comme comment vous interagissez avec un QR Rabbit, MQ, non ? Ou patron de service. Vous évalueriez pour interagir avec un service de messagerie, tout ce qui est un tiers. Maintenant, vous n'êtes pas le bon dans les instructions East sur le code directement car vous écrivez simplement du code pour interagir avec elle, alors c'est là que vous commencez à faire vos
tests d'intégration pour tester comment puis-je interagir avec elle. Après l'interaction, ai-je obtenu un résultat que je m'attendais ? Donc avec tout cela fait, passons à notre Git et un check in. Bien sûr, nous allons écrire un message qui indique le travail qui a été fait. Et puis je vais aller de l'avant et m'engager et couler. Une fois cela fait, nous pouvons faire une pause ici, puis passer à la section suivante.
22. Comprendre les tests d'unité Applications de base NET: Très bien les gars, bienvenue. Dans cette leçon, nous allons mettre en place notre projet web et nous
comprendrons pourquoi il est important de tester unitaire les projets web réels. Maintenant, pour cette partie de celui-ci, je voulais utiliser une API Web sans raison particulière ne réglera le fait qu'il est un peu plus facile de voir comment nous testons unitaires. Nous n'avons pas la surcharge d'une interface utilisateur ou quelque chose comme ça. Avec l'API, nous pouvons utiliser le test unitaire des points de terminaison assez facilement. Mais cela étant dit, les concepts de test unitaire, une API dotnet Core seraient très similaires pour les pages Razor ou une application MVC. Les seules différences réelles seraient les types de retour parce que dotnet Core est si polyvalent que les subtilités entre les différents modèles sont très, très minuscules. Très bien, donc c'est, la cohérence est très bonne. Nous allons donc de l'avant et créons nos projets API. Je vais juste ajouter un nouveau projet. Et nous allons choisir les API Web Core. Si vous ne l'avez pas à gauche, vous pouvez toujours rechercher l'API Web Core sont juste cette API. Mais une fois que vous avez trouvé le modèle, ce que nous allons nommer celui-ci est la pièce qui groupera cette API. Si vous voulez utiliser les pages Ariza ne sont pas l'application MVC, vous le nommerez wi, autre
chose, mais ne sont pas des pages NVC R-dot, quoi qu'il soit, vous voulez le nommer. Mais comme je l'ai dit, je vais démontrer en utilisant l'API pour les frais généraux inférieurs en général. Pour qu'on puisse aller de l'avant et toucher Next. Et nous pouvons tout laisser tel quel. Et est-ce qu'il crée de la même manière que ce que nous avions fait avec les autres projets de tests. Nous allons juste aller de l'avant et ajouter un nouveau projet, qui sera un projet de test unitaire x. Ce sera une chambre réservant beaucoup, api dot tests. Et puis nous pouvons utiliser cela et créer aussi. À ce stade, je vais juste aller de l'avant et dépendances bridgette. Donc, d'abord pour le test est allé, eh bien, laissez-moi commencer par l'API. Donc, pour l'API, il va certainement avoir une dépendance Bridget sur la couche de persistance et sur la couche de base. Donc, vous pouvez aller de l'avant et les ajouter. Maintenant, nous ne sommes pas prêts à aller beaucoup plus loin que ça pour l'instant. Au lieu de cela, nous allons simplement examiner les concepts
de la raison pour laquelle nous ferions des tests unitaires à ce niveau. Donc, le test unitaire est tout sur la recherche de bits automatiques et les
morceaux de votre application fonctionneront dans certaines circonstances. Donc, plus vous avez de couverture, mieux dans cette situation, nous avons déjà une couverture pour notre noyau Up. Donc, tout autre processeur ou toute autre classe logique métier ou opérations que nous ajoutons, nous pouvons tester unitaire à ce niveau. Les tests de persistance sont à notre test, tiennent les opérations de base de données avec nous, et s'assurent qu'ils font ce qu'ils sont censés savoir quand vous ajoutez un, il seul est ajouté, et cetera. Maintenant, au niveau de l'application, il s'agit plus de voir comment l'application répondra à certaines circonstances. Donc, avec n'importe quelle application Web, lorsque vous recevez une entrée valide, vous vous attendez à ce que AS ou une action soit entreprise si vous recevez entrée
non valide ici en attendant que certaines actions soient prises, certaines choses peuvent être contrôlées à partir de la côté code, pas nécessairement l'interface utilisateur ou les présentations du code derrière ou la petite logique s'exécutant en arrière-plan. Donc quelque chose comme coder contre une logique non
valide, entrée non valide, désolé, donc l'utilisateur saisit les mauvaises valeurs. Vous avez une validation qui devrait voir si elle est invalide, puis retourné à pj sont retournés une forme de résultat dans le cas d'une API. Et si elle est valide, alors la cupidité directe vers une autre page ou retourner un certain type de résultats. Donc, ce sont les choses que vous voudriez tester unitaire pour tout ce niveau d'application. Donc, si nous regardons l'exemple de projet pour l'API, nous voyons que nous avons un contrôleur de prévisions météorologiques qui a un point de terminaison renvoyant certains résultats de prévisions météorologiques de type. Sachez que je vais vous montrer à quoi ressemblerait exactement un test unitaire pour ce point de terminaison d'API ou pour le contrôleur en général. Donc, en utilisant le test unitaire une classe que nous
supprimons habituellement, nous allons juste écrire ce genre de tests. Tout d'abord, nous avons besoin de notre dépendance de projet, elle est ajoutée pour le projet API aux projets de test API. Alors allez-y et faites ça. Et pendant que nous sommes
là, allez-y et sautez dans NuGet et nous allons devoir ajouter l'outil simulé, la bibliothèque de verrouillage devra également ajouter sûrement. Donc, vous voyez dans bonjour fonctionne astucieusement, vous voyez dans l'ensemble l'affirmation négative deux projets unitaires x travail. Vous pouvez faire vos propres inférences quant à celle que vous préférez. Ce n'est pas un problème. Mais je vais sûrement utiliser pour cette série de tests. Alors installez, simuler et installer, puis passez à nos tests unitaires un fichier par défaut que je suis venu avec notre projet, je ne l'ai pas supprimé. Nous pouvons l'utiliser comme un exemple pour voir comment ce contrôleur de prévisions météorologiques serait testé à l'unité. Donc, dans notre test unitaire sur dossier, écrivons juste un testeur qui est un devrait. Retourne les résultats des prévisions D' accord ? Non, Dans mes instructions d'utilisation que j'utilise ne devrait pas utiliser x unit et utiliser System.in. Certes, au fur et à mesure que nous tapons, vous les verrez. Vous avez la chance de mettre ce qui manque. Donc, vous n'avez pas besoin de répliquer ça maintenant. Mais au fur et à mesure, vous voyez ce qui doit arriver. Donc, d'abord, nous devons nous moquer de l'enregistreur qui est présent à l'intérieur du contrôleur de prévisions météorologiques parce que nous avons cet enregistreur en train d'être injecté. Donc, pour accéder à l'enregistreur, nous avons besoin d'un objet de ceci. Et en sachant tout cela, nous nous moquons de ces choses au fur et à mesure que nous avançons. Bon, donc je vais devoir dire que l'enregistreur Var Mach est égal à une nouvelle maquette de lager par rapport au contrôleur de prévisions météorologiques. Bien sûr, tous les types manquants, vous allez avoir besoin de l'instruction simulée de top une fois que vous tapez cela. Et puis je logger va probablement avoir besoin utilisent la déclaration. Et puis bien sûr, le contrôleur de prévisions
météorologiques aura besoin que l'utilisation de la déclaration aussi. Il suffit donc d'aller de l'avant et de contrôler les points et d'inclure toutes les références manquantes. Prochain arrêt, nous devons initialiser ou contrôleurs. Donc, je vais juste dire que le contrôleur var est égal à une nouvelle instance du contrôleur de prévisions météorologiques, qui prend logger objet simulé comme paramètre, peu comme vous le verriez ici. Nous instancions une nouvelle instance de contrôleur de prévisions
météorologiques et lui donnons cet objet logger. Maintenant que nous avons fait tout ça, nous devons répondre à l'appel. Il n'y a qu'une seule méthode pour tester notre justice, pour obtenir un résultat. Donc on a vraiment besoin d'appeler le get. Donc, pour appeler le getter, je vais dire que le résultat var est égal au point du contrôleur obtient. Ensuite, nous pouvons faire nos affirmations sur le get so ou sur les résultats plutôt. Donc, je peux affirmer que peut être le résultat devrait être supérieur à un. Vous pourriez probablement aussi affirmer que les résultats ne doivent pas être nuls. J' ai accordé ces deux sortes de vont main dans la main. Si ce n'est pas nul, si le nombre est supérieur à un, alors il n'est évidemment pas nul. Mais il est possible que cela ne soit pas nul, mais les cônes n'est pas enraciné sur un, non ? Donc, vous savez, vous mettez toutes les affirmations, nous voyons que nous mettons toutes les affirmations que nous voulons nous
assurer que notre méthode fait ce que nous attendons d'elle. Donc, je teste après le fait dans cette situation. Donc, c'est là que ce genre de division arrive avec tests
unitaires parce que parfois le test unitaire
est, est introduit après le fait. Et puis à ce stade, il n'est pas certain que
devrais-je affirmer exactement par rapport au code déjà écrit, non ? Versus quand vous écrivez le test d'abord, puis vous écrivez la citation trop le test, alors vous savez exactement comme pour comme ce qui doit se passer. Quoi qu'il en soit, essayons de faire ce test et voyons si nous obtenons de bons résultats. Et après avoir fait ce test, je vois que nous avons des tests d'accord. Donc, nous avons un test vert bien sûr, car il existe déjà des tests, le code existe déjà plutôt. Donc, si j'ai fait quelque chose comme return null, disons que ce soit refactor know, et pour, vous savez, j'ai introduit par inadvertance ce retour null quelque part dans cette méthode qui va complètement biaiser ce qu'il devrait retour, alors notre test devrait savoir qu'il échoue. Et on y va. Donc maintenant, nous voyons qu'ils recevaient une autre exception. Et cette exception est plus liée à notre affirmation qu'avec le code lui-même, Fred, il obtient cette exception de connaissance parce que je retourne null. Et c'est nul. Donc, vous ne pouvez pas trouver les cônes hors null. Tu peux trouver le nombre de rien, non ? Donc, permettez-moi de réorganiser cette affirmation et d'essayer à nouveau, nous devrions voir un autre type d'époque, moins erreur d'exception pas inconnue. Et on y va. Donc, nulle part obtenir un message disant que le résultat ne devrait pas être nul, acheté était tout droit. C' est donc notre affirmation. Sachez que je vois qu'il ne devrait pas être nul. Donc, il s'arrête avant même d'arriver à celui-ci pour sentir que c'est nous faire savoir que les champs d'assertion. C' est donc un exemple de base de la façon dont nous unissons les contrôleurs de test ou
par r, par extension, le projet web dans le noyau ASP.NET. Donc, quand nous
reviendrons, nous mettrons en œuvre notre propre contrôleur et test unitaire ou propre contrôleur avec les tests unitaires plus significatifs ou adaptés au contexte.
23. Configurer la boutique de données dans la mémoire Sqlite: Hé les gars, bienvenue. Avant d'aller plus loin avec nos tests de notre application web, je veux que nous configurions la banque de données et je lui donnerai que c'est juste une obligation d'échantillon rapide et je ne vais pas aller aussi
loin que de mettre en place une base de données SQL Server entière pour une seule ou deux tables, on va garder son bébé. Nous allons utiliser une connexion SQL Lite en mémoire. Bon, donc dans le fichier CSS point de démarrage, allons sauter là-bas. Et sous l'implémentation de swagger, nous pouvons commencer par dire chaîne de connexion var, je vais juste appeler le mien Khan. La chaîne est égale à la source de données égale deux-points, mémoire deux-points. Bon, maintenant, si vous voulez plus d'informations à ce sujet, vous pouvez toujours regarder comment vous connecter aux bases de données SQL light in-memory dans une application dotnet Core, il y a de la documentation dessus, mais je n'entrerai pas dans trop détails, non ? Null. Au lieu de cela, je vais simplement continuer avec une chaîne de connexion. Donc, je vais dire Var Con, escroc. Notre connexion est égale à la nouvelle SQL I t0. Donc OCC SQL ITE connexion. Et puis nous passons cette chaîne de connexion. Donc, bien sûr, maintenant, nous savons que chaque fois que nous voyons ces soulignements rouges, nous contrôlons cela. Et puis vous voyez ici j'ai besoin d'un paquet pour Microsoft dot SQL I dot core. Donc, je vais aller de l'avant et trouver et installer la dernière version. Et quand cela sera fait, nous pouvons continuer en voyant des points coniques de Sean ouverts. Donc, à ce stade, nous allons ouvrir la connexion à la base de données SQL en mémoire. Ensuite, nous devons laisser les services et tout ce dont nous avons besoin pour ajouter un contextes DVI. Et notre contexte DB sera ce que la configuration dans la couche de persistance, qui est notre salle de réservation dans le contexte DB, n'est-ce pas ? Donc, il est relatif à ces points de contrôle ou je n'ai pas besoin de point de contrôle parce que nous avons sur cela. J' utiliserais des instructions sur coller. Donc, quand je l'ai copié et collé, vous voyez qu'il a automatiquement ajouté l'instruction using pour la persistance. Je vous encourage donc à utiliser cette fonctionnalité beaucoup. Alors je peux lui donner quelques options. Où je vais voir votre option est d'utiliser SQL. Ça, ce que je soupçonne qu'il va avoir besoin d'une forme de bibliothèque. Mais en attendant, je vais passer dans les points de contrôle de l'objet de connexion. Et ça ne m'aide pas. Mais je ne fais pas la balle à NuGet avec celui-ci. Donc, je vais aller à New get pour le projet web. Et je crois que je vais avoir besoin d'Entity Framework Core avec SQL IT. Très bien, Donc, dans l'idée SQL et a obtenu un tas d'autres résultats, il est en fait facile de taper dans Entity Framework Core, et puis vous verrez deux points de travail différents SQL ITE dire peut aller de l'avant et télécharger et installer ce paquet. Et puis en revenant à notre fichier de démarrage, si je fais beaucoup de contrôle, vous verrez les options de déclaration d'utilisation venir et ensuite nous sommes dans le clair. C' est donc à quoi ressemblera les contextes RDB pour notre application web. Bien sûr, dans un environnement réel, vous auriez une vraie connexion à la base de données qui vivra probablement dans l'application settings.js sur. Et puis tu injecterais ça. Si vous voulez savoir comment cela se passe, vous pouvez filtrer un de mes autres cours de base dotnet où nous utilisons réellement de vraies bases de données. Mais juste pour ce scénario où nous regardons simplement TDD dans ce contexte. Je n'irai pas embauché, je vais juste me contenter de l'implémentation en mémoire. Alors sachez que c'est fait. Quand nous reviendrons, nous pouvons commencer à configurer notre contrôleur et nous cacher à certains tests unitaires.
24. Créer des Scenarios d'unité: D' accord, alors laissez-nous écrire tous les tests unitaires pour
le contrôleur de l'API. Donc nous n'avons qu'un seul contrôle, comme vous pouvez le voir, nous faisons juste une preuve de concept avec un très petit haut, mais nous regardons les tests unitaires et les différents niveaux. Donc, cette API va être assez simple. Il va juste avoir sous l'API que nous devons être liés à mesure qu'ils se déplacent dans le centre. Et puis nous allons permettre à l'utilisateur de réserver une pièce, vouloir retourner un ancien résultat clé avec objet
résultat comme un tout lorsque vous arrivez à un objet résultat. Et nous voulons ajouter de la validation et rejeter les mauvaises demandes. Dans notre code, il y a peu de choses que nous devons faire. Un, créez ce nouveau contrôleur pour la réservation de chambre. Donc j'ai appelé ça le contrôle de réservation de chambre. Si vous n'êtes pas si familier avec les API, vous pouvez toujours retirer mes cours d'API. Mais si vous avez besoin de savoir comment ajouter ce contrôleur ici et non, vous cliquez avec le bouton droit sur le contrôleur fessier dossier contrôleurs, puis appuyez sur API et créez ce contrôleur vide avec le même nom. Donc, cela vous donnera ces modèles de base. Dans le même souffle. Vous pouvez également aller de l'avant et frapper nouveau, créer un nouveau fichier de test contrôleur de réservation de chambre dans notre API pour répandre ou pas quand vous le montrer juste pour l'instant parce que j'ai une certaine coordonnée. Eh bien, nous allons passer par ça ensemble pour qu'ils puissent créer ce fichier. En attendant, ce que je vais faire, cependant, c'est de me diriger vers nos projets de base et de mettre en place notre service de données, ou désolé, pas le service de données ou le sous-traitant. On y va. la même façon que nous avions notre service de réservation de salle d'oeil et que les services de réservation de salle d'oeil ne font qu'obstruction par Nikon, en plus de notre couche d'accès aux données. Et puis nous avons la mise en œuvre ici. Nous avons besoin de notre processeur pour être injectable. Donc, en ce moment, c'est juste le béton, une classe que vous créez une fois dans un endroit et que vous vous déplacez le long de ce que vous
voyez alors c'est tout le chemin ici dans le noyau et nous avons besoin, c'est tout le chemin ici dans l'API. Donc, ce que je vais faire est de cliquer sur le point Contrôle de la pression vapeur de classe. Et puis vous voyez que vous avez un certain nombre d'options. One-off qui inclut l'interface d'extraction. Donc, lorsque vous créez l'interface avant, la classe héritante doit implémenter cette interface. Dans ce cas, nous avons déjà créé la classe, donc non, nous avons besoin de l'interface. Je vais juste cliquer sur Extract Interface. Oui, je voulais connaître un nouveau fichier et vous voyez qu'il donnera automatiquement ce fichier que j'encourage la convention de nommage. Et il sera, vous pouvez sélectionner et désélectionner la méthode que vous voulez là-dedans, vous cliquez sur OK. Et puis maintenant, nous avons notre, notre interface qui implémente le processeur des demandes de réservation. Maintenant, l'APA doit y accéder. Donc, pour le rendre accessible et injectable, nous devons venir à notre startup. Et je vais juste ramer, je peux le faire dans le contexte db. Je dirai les services point, et nous pouvons ajouter portée. Je une fois de plus, si vous n'êtes pas familier avec l'injection de dépendance, gluckle un de mes cours de base dotnet, ce que j'ajoute portée et je vais ajouter
le processeur de demandes de réservation de salle d'oeil parallèlementà le processeur de demandes de réservation de salle d'oeil parallèlement sa mise en œuvre afin qu'il peut être injecté et utilisé par l'un des contrôleurs de notre API. Donc c'est tout ce qu'il faut, non ? Alors passons au fichier de test. Donc, comme je l'ai dit, j'ai écrit un peu de code, mais je vais vous accompagner ligne par ligne. N' hésitez pas à faire une pause, à répliquer. Mais je vous expliquerai tout. Je pense qu'ils sont juste un peu les choses à faire pour que tu me regardes taper. Alors j'ai juste préparé ça et je t'y expliquerai quoi que ce soit. Donc, j'ai tous les actifs ou au moins certains des actifs que je sais, c'est un peu préparé en haut. J' ai donc mon constructeur où j'initialise un service de réservation de chambre pour être une nouvelle instance du processeur des demandes de réservation. J' ai une instance de mon contrôleur. Et rappelez-vous que vous pouvez réellement taper sur ce terrain, puis utiliser le
point de contrôle pour générer rétroactivement cette méthode que nous avions fait, désolé, ce champ. On l'a fait quelques fois avant ça. Donc, pour le contrôleur, vous voyez ici que je suis en train d'initialiser mon contrôleur de réservation de chambre et il a une ligne rouge parce que je lui donne aussi le service de réservation de chambre. Objet de pensée. Et ça m'a probablement permis d'appeler ce processeur de réservation de chambre au lieu de service, non ? Juste pour être explicite et clair avec les noms, processeur de réservation de
chambre et refactoriser le long du chemin. D' accord. Donc, l'objet simulé du processeur de réservation de chambre est transmis au contrôleur de la pièce. Donc, à partir d'ici, je peux faire des points de contrôle et le laisser générer ce jumbo constructeur là-bas. Et puis je vais juste renommer
ces processus de demande de réservation de chambre ou processeur de réservation de chambre. Avec le trait de soulignement et un sans. Donc, sachez que notre contrôleur a l'instance
du processeur des demandes de réservation de chambre qui est injecté et prêt pour vous. C' est très bien. Sinon, j'ai une instance de notre demande et une instance hors de nos résultats. Une autre chose que je vais faire, et on peut le faire ensemble, c'est de mettre en place ce Mach, non ? Alors rappelez-vous que ce simulacre a besoin de savoir que quand il est appelé, ce qu'il devrait faire. Bon, donc on fait la mise en place. On va régler le X-dot. Et il n'y a vraiment qu'une seule salle de livre de méthodes. Vous auriez besoin d'une fausse bibliothèque bien sûr. Et je vais utiliser devrait vivre pour mes assertions, s'efforce de juste au cas où je ne parviendrais pas à mentionner ceux plus tôt, assurez-vous qu'ils vont à NuGet et vous installez ces deux paquets. On l'a déjà fait. Et si vous n'êtes pas si sûr, vous pouvez toujours aller au projet de test précédent. Vous pouvez littéralement copier ces deux lignes. Allez à votre projet remarqué et collez-les là-dedans. Et puis faites simplement une construction et il installera automatiquement ces paquets pour vous. Alors installons notre salle de livres. Donc, notre salle de livre ou nécessite une forme d'objet de demande. Donc je vais lui donner nos demandes ici. Et puis il doit retourner une certaine forme de résultats. Donc, je vais juste dire que les retours de points sont en fait un type qui est sur sa propre place qui devrait être en dehors des retours de points. On y va. Et ce qu'il reviendra, c'est une forme de résultats. D' accord, donc je les laisse aussi. Ils sont instanciés, mais ils n'ont pas encore de données utiles en eux. C'est très bien. Mais c'est notre configuration pour notre processeur à la recherche de la pièce. Si on descend un peu, tu verras que j'ai un test polyvalent ici. Et ce test va couvrir les scénarios d'outils de notre exigence. L' exigence est que nous devons permettre à l'utilisateur de réserver une chambre. J' y suis allé, c'est invalide. Nous rejetons la tentative. D' accord ? J' ai donc une théorie et j'ai deux bits de données, deux rangées de données à intégrer. Donc, le premier voit que c'est le nombre attendu d'appels de méthode, qui est un. Lorsque le modèle IS valide est vrai et il doit retourner le type de résultats Old Key Object. Donc, le problème est qu'il y a type de résultat axone attendu. Donc, avec les API, vous pouvez retourner, ok, peut retourner 404 ou mauvaise demande, et cetera. Donc, nous voulons nous assurer que quand tout va bien, nous obtenons au moins un appel de méthode à la salle de lecture et nous sommes en mesure de rejeter que Kirk est allumé rapidement. Désolé. Donc on a un appel de méthode dans notre salle de lecture. Et quand il est valide, et nous obtenons cela, ok, les objets résultats quand il n'est pas valide, nous ne voulons pas d'appels de méthode et ce devrait être une mauvaise requête. Donc, ceux-ci vont en ligne avec trois paramètres et le nom des statistiques devrait appeler la méthode de réservation lorsqu'elle est valide. D' accord, je pense que c'est assez simple. Maintenant, pour l'arrangement, je vais forcer l'état modèle du contrôleur à être ce qui était Boston. Eh bien, ils sont vrais ou faux, non ? C' est un modèle valide. Donc, si ce n'est pas valide, ce qui signifie que nous passons dans les chutes, puis passez à ajouter manuellement l'erreur d'état du modèle. Ensuite, nous allons, je suis allé voir nos poids, le contrôleur. Alors remarquez que j'utilise un poids. Nous n'utilisions pas de méthodes asynchrones avant cela. Et c'était un peu délibéré d'autre sorte de contourner ça. Mais non, voyons comment nous pouvons faire des tests asynchrones. Pas de problème avec ça. Donc tâche asynchrone, c'est la signature de la méthode de test. Et puis ici, nous attendons notre contrôle ou appelons cette méthode appelée salle de livre, obtenant un objet de requête. Donc, ce que je vais faire ici est d'utiliser le point de contrôle et de générer cette méthode. Sautez là-bas et je vais en faire une AsyncTask qui renvoie les résultats d'action I. Très bien, juste pour s'assurer qu'il sait qu'il devrait retourner quelque chose qui est d'un type de message de réponse HTTP, généralement parlant. Très bien, donc avec ça fait, nous nous débarrassons de cette erreur. Nous avons cette mini-implémentation. Ensuite, nous pouvons affirmer que le résultat doit être de type, type de résultat
attendu de la vente aux enchères. D' accord, quel que soit le type, je suis Boston avec les deux scénarios. Nous affirmons que cela devrait être notre genre. Je vais aussi voir que notre processeur de réservation de chambre. J' ai donc fait un peu de changement de nom depuis que nous avons commencé cette leçon. point de processeur de recherche de pièce vérifie que
la salle de livre avec la demande est appelée exactement ce nombre de fois, qui est transmis à travers nos données en ligne. Null. Vous pouvez simplement faire une construction. Et puis une fois que cette construction a réussi, vous sautez à l'Explorateur de test. Et puis vous verrez vos tests d'API. Et je vais juste exécuter les tests d'API. Et nous devrions voir ou il teste tous appartiennent, ou du moins pour ce que nous venons d'écrire. Bien. Nous devons donc lire les tests parce que les deux voient le système non implémenté. Bon, pour qu'on puisse faire une pause ici. Une fois de plus, vous pouvez passer en revue, mettre en pause et répliquer si nécessaire. Mais quand nous reviendrons, nous commencerons à écrire la mise en œuvre. Nous avons donc quelques choses que nous devons couvrir, y compris la validation par l'OMS sera gérée, général, et ce que la méthode du contrôleur fera en fonction des scénarios.
25. Créer le code pour les tests: Bon, donc nous avons écrit nos tests unitaires. Il a probablement encore une certaine marge d'amélioration, mais cela nous donne une idée générale de ce que nous devons mettre en œuvre pour réaliser l'exigence de base. Donc, je vais commencer par la validation parce que j'ai besoin d'un moyen de m'assurer que la validation est réellement effectuée. La chose cool à propos de dotnet Core est que nous avons juste besoin d'
aller à notre modèle que nous savons est entrant et configurer notre validation. Donc, juste pour vérifier la chambre de réservation attend des demandes de réservation de chambre. La demande de réservation de chambre n'a en fait pas de champs. Alors, comment puis-je ajouter des validateurs aux champs ? Rappelez-vous qu'il hérite de notre méthode de base, laquelle nous pouvons ajouter les validations. Et tout ce qui hérite de cette base, qui serait les requêtes, les résultats et l'objet de domaine réel obtiendrait ces règles de validation. Donc, le premier, qui est le nom complet de la personne que je vais ajouter nécessaire. Et que la longueur de la chaîne devrait être plus, ne devrait pas être supérieure à 50. Pensable, être un peu pointu, tomber les noms complets. Laisse-moi y mettre. Bien sûr, en fonction de votre règle métier, vous ajoutez vos validations en conséquence. D' accord, la prochaine, je vais faire la même longueur de corde. Donc, pour l'adresse e-mail, je vais aussi le rendre obligatoire et ensuite je peux ajouter que je voulais être une adresse e-mail. D' accord. Le suivant, je vais ajouter que le do, le type de données est l'IT. Et à ce stade, vous pourriez même penser d'autres validations que vous pourriez le mettre en C qui doit être dans le futur ou copier dans le passé, genre de choses. Ce point, vous créez un attribut personnalisé ou vous pouvez le laisser hériter de l'objet invalide. Et cela vous fera implémenter cette méthode ici avec l'œil innombrable résultat de validation appelé validate et lui donnant un contextes de validation. Donc, à ce stade, je peux probablement faire quelque chose comme si b est inférieur à la datetime Node.js. Bon, voilà ce que je vois. Si les données fournies par l'utilisateur s'avèrent être inférieures à la date d'aujourd'hui. droite ? Ensuite, je vais donner un nouveau résultat de validation où je leur envoie Mme, et ce doit être à l'avenir. Donc vous pouvez tweeter ça. Je dis que doit être un rendez-vous futur, donc je peux facilement dire où il est inférieur ou égal à. Donc ça veut dire qu'ils ne peuvent pas réserver pour que ce soit nos actes dans le passé. Ils doivent être dans le futur. Et puis à la deuxième législature, ce genre de résultats de validation serait le nom ou les noms des députés. Noms de membres parce que c'est une zone où vous pouvez fournir une valeur, qui est ce que je fais. Donc, le message d'erreur, puis l'aria avec les membres qui sont affectés par cette validation. Donc ici, je vois juste un nouveau tableau passant dans Name off beat. Donc, pour cela, c'est juste la clé quel champ ou le nom du champ avec l'erreur. Le problème avec cela est que si je change ceci, la date de réservation plus tard et oublie de mettre à jour cette chaîne, alors il y aura une incompatibilité. Vous voudrez donc fortement taper en voyant le nom désactivé, puis le nom du champ. Donc, il évalue ce serait la version de chaîne hors du nom du champ. Et puis les avantages supplémentaires à cela seraient que si je fais un refacteur global ou même si je refactorise ce nom et oublie de le changer ici, je vais juste obtenir des erreurs de compilateur et je ne serai pas en mesure pousser ce code erroné à production. Donc ce sont les choses que nous allons le long. Oui, c'est un développement piloté par des tests. Mais ce faisant, nous voyons les meilleures pratiques qui réduisent la probabilité d'erreurs au fur et à mesure que nous allons dans notre code. Donc j'ai juste ajouté toute cette petite validation à notre base. Donc, cela signifie intrinsèquement que toutes les variantes de réservation de chambre sauront avoir cette validation de base. Très bien, donc ce que nous voyons ici pour donner suite à la demande et nous savons que l'objet de domaine pour la réservation de chambre aura également cela. Maintenant, dans notre contrôleur, nous devons mettre du code qui gère nos scénarios. Donc, la première chose que je vais faire est de vérifier si l'état du modèle est valide. Donc, je peux dire si l'état du modèle est valide et cela serait informé par les données entrantes par la demande de réservation de chambre. Et pendant que je suis ici, je vais juste lui dire que c'est un post de méthode HTTP, non ? Donc, c'est la méthode de post HTTP. Donc, juste en appelant la
barre oblique de réservation de salle avec une demande de poste sur cet oreiller qui ressemble à nos demandes de réservation. Il saura que c'est là que c'est censé le faire, le but. Donc, si l'état du modèle est valide, alors je veux continuer à appeler le processeur de réservation de chambre. Et je vais appeler la méthode de l'équipe de livre dans les processus de réservation de chambre. Donc, si nous sommes valides, alors allez-y et appelez cette méthode. D' accord. Si cependant, le résultat inondent le sol, rappelez-vous qu'en fait cela revient. Résultats à la recherche de chambre. Si nous regardons et voyons ce que cette pièce va tuer le résultat est, vous voyez ici que nous obtenons mais pas inondation et nous obtenons cette carte d'identité. Donc je vais savoir que je pense boulonné plus d'hiver. J' ai réalisé qu'il y a peut-être un autre scénario que je pourrais tester, mais très bien. Cela donne les résultats de la réservation de chambre. Donc les résultats var est égal à n'importe quel résultat ce terme, cela retourne. Non, ce ne serait pas prudent pour moi de leur dire. D' accord. Le bateau que vous réservez a échoué parce que n'oubliez pas que ce résultat a un succès ou un échec d'inondation. Donc, je vais dire si les résultats point inondation, désolé s'il y a une inondation est équivalente à, et je peux obtenir les énumérations juste là. Et je vais dire, si c'est équivalent à la réussite, alors je veux retourner tous les fonds Keras ou tourner,
ok, gardé la pâte avec les résultats. N' oubliez pas que ce résultat aurait été compilé par nos salles de livres. Donc, ce robot fait le long de la chaîne de marguerites pour voir. Donc la chambre BOC appelle le résultat ici, non ? Et puis nous voyons créer cela basé sur les demandes de serre-livres. Donc tous ces champs qui ont été transférés, ok ? Et puis s'il y a des chambres disponibles, alors nous voulons revenir avec la carte d'identité et le drapeau de succès. C' est ce qui va dans les résultats. Sinon, les résultats silicones environ avec toutes les valeurs, juste avec l'inondation de défaillance. D' accord ? C' est donc ce que nous pouvons faire dans cette situation. Donc nous retournons juste la réponse OK avec toute la charge utile du résultat avec l'ID de réservation de la chambre, l'ID de la chambre, tout le shebang, tout ce qui aurait été compilé à partir de là. Donc si je fais tous mes tests, Voyons voir. Oh, je suis désolé, je reçois une erreur de compilation parce que tous les chemins de code ne retournent pas. Donc je vais retourner une mauvaise demande ici, non ? Est-ce, si cela ne nous mène pas loin que l'ancien K, alors je vais juste voir un retour mauvaises demandes. Laisse-moi juste jeter mes tests à nouveau. Et vous verrez que j'ai un test vert et un test rouge. Donc, le test voit qu'il devrait être de mauvais résultats d'objet de requête, et ce n'était qu'un mauvais résultat de requête. D' accord, ça soulève une question intéressante. Quelle est la différence entre les mauvais résultats d'objet de requête et les mauvais résultats de requête ? Et bien, la même chose avec l'ancienne affaire. Donc les résultats de l'objet OLC sont différents de, ok, non ? Donc, vous voyez l'ancien résultat clé est là parce qu'il n'y a pas de paramètres. Donc d'accord, en soi signifie pas de paramètres. Cependant, une fois que vous mettez des paramètres là, une fois que vous passez un objet avec la réponse, il devient les anciens résultats de l'objet clé. Donc mauvaise demande par elle-même est le résultat de la batterie par les résultats des requêtes. Mais on pourrait y mettre des données. Donc, de manière générale, lorsque vous retournez une requête incorrecte, car hors d'une validation de champ, vous pouvez simplement mettre l'état du modèle là. Et l'ensemble de JSON saura comment le désérialiser et présenter à l'utilisateur que ce sont les points de validation basés sur l'échec, non ? De même, lorsque le drapeau ne réussit pas, je ne veux probablement pas lui donner l'état du modèle parce que la loi de l'état modèle est valide. Cependant, la réservation a échoué, peut-être qu'il n'y avait pas de chambres disponibles ou quelque chose. Ce n'était pas vraiment une validation sur le terrain pour les résultats de la batterie ou une mauvaise demande. Et c'est là que vous commencez probablement à devenir un sommet fonction de la façon dont vous voulez que votre conception API fonctionne. Eh bien, ce que je vais faire, il a déjà passé la validation ici. Et disons qu'il n'y avait pas de chambres disponibles. Donc, cela ne nous a pas donné le flot de succès. Donc ici, il est clair que si nous n'avons pas eu le drapeau de succès dont ils avaient besoin ou la clé éternelle, une fois que je suis allé faire, c'est dire les modèles, l'erreur du modèle, non ? Et c'est moi juste en supposant que c'est seulement arrivé si loin parce qu' il n'a pas obtenu le Flau'jae subsiste était valide mais n'a pas eu le flot de succès, Quelqu'un a une erreur de modèle moi-même. Et je vais l'ajouter au nom. Et le champ viendra de la salle, se souciera champ de date point de demande. Depuis que je voulais juste pointer, ils diront important en utilisant ce nom de paramètre est. Parce qu'une fois de plus, si nous avons refactorisé, cela serait certainement considéré dans la liste des erreurs sont une liste de facteurs de risque ne sont pas. Donc, il est moins de suivi en vrac et d'essayer de peaufiner les cordes magiques osseuses qui jettent de l'application. Donc, je vais ajouter un état de modèle sont juste fait un D8. Et je vais voir qu'aucune chambre disponible pour une date donnée. D' accord. Ce sera la seule raison pour laquelle il se sent juste. Cette pensée basée sur les règles d'affaires que nous avons jusqu'à présent. Et puis cela serait ajouté à eux, toutes ces données, nous retournons toujours la mauvaise requête avec ledit état du modèle. D' accord, donc juste là en un seul coup où soit retourner ancien AQ ou retourner la demande de beurre avec les erreurs de validation. Et celui-ci est en quelque sorte ad hoc basé sur le processus, n'est-ce pas ? Alors faisons tous les tests à nouveau. Et maintenant vous verrez que j'ai cette tique verte, deux sur deux qui passent et c'est excellent. Donc, vous voyez que nous venons de faire une implémentation rapide pour répondre à notre logique de test dans notre puits, pour rencontrer la logique des artistes, correct, nous avons fait l'implémentation, mais nous avons implémenté quelque chose que nous ne testons pas nécessairement pour notre comptabilité avec les artistes, qui est ce drapeau de résultat. Donc, je vais revenir au test et je vais l'
ajouter à la section pilotée par les tests. Donc, je vais ajouter l'énumération ici. Si je m'en souviens, il réservera l'indicateur de résultat ou ajoutera quelqu'un pour l'ajouter en tant
que paramètre ou test piloté par les données, c'est nul. Et je vais dire indicateur de résultat comptable. Donc, je vais devoir ajouter que les données intérieures devraient, quand tout est valide, avoir ce drapeau pour le succès. Et quand les choses ne sont pas valides, il devrait aussi avoir ce pot de fleurs pour l'échec. Donc, dans ma gamme, je vais ajouter cette instruction if pour voir si le drapeau de résultat du livre King a une valeur, qui signifie qu'un a été fourni, oui, un a été fourni. Et franchement, je n'ai même pas besoin de la rendre plus libérale, venez y penser. Je pense juste à l'introduire après le fait. Mais je veux dire, c'est moi qui contrôle les données, donc je vais les présenter et les laisser tranquille. Donc, je n'ai aucun scénario où ce serait jamais non, toute façon, pas dans ce test. Laisse-moi revenir en arrière. Ce n'est pas un paramètre nullable. Et nous en passons un pour le succès, un pour l'échec. Et puis rappelez-vous que notre champ de résultat était initialisé ici. Et le sett voir est que la méthode de la salle de livre lorsqu'il est donné une demande devrait retourner un résultat. Donc, je vais, je vois ici est que quelle que soit la valeur est dans ce scénario ou dans les données transmises pour ce scénario,
définissez cela comme étant l'indicateur de l'objet résultat, qui va être retourné une fois que cette méthode est appelée de toute façon. Donc je vais aller de l'avant et faire ces tests une fois plus juste pour m'assurer que je vais toujours avoir une note de passage, d'accord. C' est seul. Et on y va. Donc je reçois toujours des laissez-passer. Et ce sont tous les tests. Donc je vais juste faire tous les tests en vue et tout passe. C' est donc un moyen très basique de tester votre API et par extension votre application web. Parce que la seule vraie différence encore une fois, entre moi tester une API par rapport à vous tester pages
Razor ou un MVC vers
le haut serait les types de retour que vous testez basés sur le vôtre. Maintenant, de façon générale, lorsque les revenus de la MVC, vous allez soit retourner une vue ou rediriger vers une autre. Rediriger vers un autre point de vue, notre radar à la vente aux enchères plutôt. Quand il s'agit de nos pages Razor, vous retournez la page ou vous redirigez vers la page et vous utilisez d'autres retours pj, qui est considéré comme des résultats de page. Si je ne me trompe pas. Ainsi, vous pouvez avoir rediriger vers les résultats de la page. Habituellement, faites cela quand c'était une opération réussie. Mais quand ce n'est pas une opération réussie, vous retournez généralement juste le pH. On y va. Donc j'ai juste besoin de cette bibliothèque pour revenir au test si vous envoyez juste des résultats de restauration. Très bien, donc juste de la même façon que si elle est valide, vous voulez rediriger vers pitch. Et si elle n'est pas valide, vous serez retourné dans les résultats payés sur IUIE, vous montreriez à l'utilisateur la page à côté des erreurs d'état du modèle, n'est-ce pas ? Si c'était un MVC en place, ce serait, je vais juste taper les résultats des enchères. droite ? Dites Qu'est-ce que vous il y aura un résultat axone ou ce serait une redirection vers les résultats d'action. Mais c'est à peu près la même chose. Les scénarios pour lesquels vous testez
diffèrent probablement en fonction de l'application que vous testez. Mais en fin de compte, les principes sont les mêmes. Donc ça va vraiment arrêter ce moindre. Je sais que nous n'avons pas été trop compliqués, mais nous en avons fait assez. Ainsi, vous pouvez apprécier les flux bas de code entiers et le test unitaire sacré au niveau de l'application, testant ce que fait le contrôleur et à quoi nos assertions pourraient finir par ressembler. Je vous encourage donc à créer les points de terminaison, à faire d'autres tests et à voir si vous pouvez penser à d'autres scénarios que vous voulez probablement tester. Je serai heureux d'entendre. Et si quelque chose, vous me tirez quelques commentaires et nous pouvons travailler dessus en conséquence.
26. Exécuter et tester l'application essentielle ASP.NET: Tous les bons gars vont à tout ça, assis et tester. Il est temps de le remettre aux utilisateurs de l'application pour réellement tester pour le modifier. Donc, pour faire fonctionner l'API, nous avons besoin de quelques configurations supplémentaires. L' un est l'ajout au service, le conteneur du CIO, la police dont nous avons besoin, le service de réservation de salle d'oeil, qui parle en fait à la base de données. Donc oui, nous avons le processeur. Le processeur s'appuie sur le service et notre application doit savoir que nous devons avoir notre représentation
du service afin que nous puissions avoir la représentation du processeur. Donc encore une fois, nous allons de l'avant et ajouter que les services point i service de réservation de chambre, service de réservation de chambre. Et bien sûr, utilisez votre point de contrôle pour inclure tout ce qui manque. Maintenant, nous pouvons passer à notre console Package Manager. Et si ce n'est pas là où vous le voyez sur mon écran pour vous-même, vous pouvez aller de l'avant et appuyez sur les outils NuGet, gestionnaire de
paquets, et pour obtenir la console. Jusqu' à présent cette console, nous voulons changer notre projet cible pour le projet persistance. Pourquoi ? Parce que c'est là que vit notre contexte DB. Donc, toutes les bibliothèques et ainsi de suite pour les commandes sont sur le point de fonctionner en direct dans ce projet, nous avions juste besoin de pointer là. Donc, je vais dire ajouter une migration de tiret, et je vais dire migration initiale. Donc, le remède rapide à cette erreur est d'obtenir le paquet de conception dans le projet API, n'est-ce pas ? Donc, si je frappe persistance, vous remarquerez qu'il a tout ce bloc XML dédié au paquet de conception. Donc, en fait, je vais juste copier ça. Et je pense qu'une autre modification que nous devons
faire est que deux autres que nous sommes la bibliothèque de base. Je pense que lorsque nous créons cette persistance, nous avons utilisé SQL Server. Donc, et quand nous sommes arrivés à l'API, nous avons décidé, Ok, nous allons utiliser SQL light. Donc, si vous voulez continuer à utiliser SQL Server, vous êtes à l'aise avec cela réglé alors bien. Aucun problème ne vous assure que vous modifiez le nôtre, la chaîne de connexion et tout pour l'API. Sinon, si vous voulez juste me suivre et vous assurer que vous n'avez aucun problème, vous pouvez aller de l'avant et changer cela. Vous pouvez simplement changer le verbiage de SQL Server à SQL IT. D' accord, donc moi et ce changement, mais encore copier ce bloc entier pour le dessin. Et nous allons sauter à l'API, assurez-vous que cela dit aussi SQL ITE et puis écrire un mur de cela. Je vais juste coller ce bloc de conception, quelqu'un pour faire une construction. Et à ce stade, le projet API sans ramasser qu'il a ce paquet de conception. Ensuite, je peux retourner à mon PCM et essayer à nouveau cette migration. Et après une construction réussie, vous verrez que nous savons que notre première migration est réussie. Donc, après que nous avons la migration, nous avons juste besoin de le dire base de données. Et c'est fait. Jetons un coup d'oeil à tout ce que nous avons. Nous avons des chambres de réservations de chambres. Ce sont toutes les tables que nous avons créées et certaines données dans lesquelles nous l'aurions vu. Donc vous voyez qu'on a des chambres. Voyez ça dans. Si vous le souhaitez, vous pouvez créer un point de terminaison où l'utilisateur peut obtenir la liste des salles. Vous pouvez créer un autre point de terminaison pour obtenir la liste des chambres disponibles. Mais le point de TDD est que vous allez devoir écrire ce test d'abord, puis vous implémenter. Bon, donc je crois que je t'ai donné assez de munitions pour que tu puisses aller les faire tout seul. Pour l'instant, testons l'API juste pour nous assurer que notre code pour lequel nous avons une excellente couverture fonctionne réellement. Donc, parce que lors de la création de l'API, nous avions coché, inclure le support de l'API ouverte, nous obtenons ce Swagger, non ? Donc, si vous n'êtes pas familier avec le football, c'est un outil puissant utile à la fois le test et la documentation des API. Si vous êtes familier avec elle, alors cela devrait être une évidence doit tenir pour l'utiliser. Donc, ici vous voyez qu'ils nous donnent un exemple de ce qui est attendu lorsque nous sommes sur le point de faire une demande de poste pour une réservation de chambre. Si je clique sur Essayer, et je ne vais pas changer les nôtres les valeurs. Je vais juste cliquer sur Exécuter, puis j'obtiens cette mauvaise erreur. Donc, je vais juste le lire et il voit SQLite sauf North. Donc divisé, il y a quelque chose que j'ai raté avec les configurations. Je vais juste revenir au bloc de code dans le fichier de démarrage, nous avons notre connexion, nous avons ou contexte AV. Et je pense que j'ai besoin de quelques lignes supplémentaires pour m'assurer que la base de données est créée. Donc, j'aime juste cette méthode, assurez-vous que la base de données a été créée et je lui donne
le, le paramètre pour la connexion SQLite. Donc, il y a controller.js et générer cette méthode qui peut être privée et statique. Pour ça,
ce que je vais faire, c'est. Objet Builder. Donc, dans tout l'objet constructeur déjà. Cela a donc été un nouveau constructeur d'options de contexte DB de type les contextes DVI que nous utilisons. Et puis sachez que nous avons que je vais dire constructeur, vous êtes supposé utiliser SQL Lite, n'est-ce pas ? Donc je vais juste copier ça. Après tout cela, je vais dire que l'utilisation de var ou de contextes est égale à une nouvelle instance de contextes RDB. Donc je suis désolé, j'ai raté ces lignes tout à l'heure. Ensuite, nous allons juste passer les options de point
du constructeur parce que je dois lui donner les options chaque fois que nous instancions cela. Et puis nous dirons contextes, base de données
point, point assurer créé. D' accord. Nous ajoutons simplement qu'il s'assure que la base de données est créée. Oui, nous avons raté tout cela,
mais à cause de la nature de la base de données, nous devons nous assurer qu'elle est réellement créée au moment de l'exécution. Bon, alors essayons encore. Donc sauter de nouveau dans swagger et faire le tote et l'exécution
et de savoir qui vous voyez quelque chose qui semble un peu mieux. Donc, ce que nous voyons ici, c'est la réponse. Donc je veux dire, il y a des opportunités, bien sûr, le nettoyer. Donc parce que vous voyez ici le déluge est 000 parce que le drapeau de succès était 0 et l'inondation d'échec était un. Nous pourrions y aller et bien sûr ensuite changer les valeurs enum. Ou nous pourrions changer le champ de résultat pour que l'inondation soit une chaîne et réellement imprimer les mots, le succès ou l'échec en conséquence. C' est à vous de décider. Si je mets quelque chose qui est invalide, comme j'ai mis dans un acte qui était le mois dernier et essayer d'exécuter cela. Alors vous voyez ici que j'ai l'état de 400 modèles ou où les actes doivent être dans le futur. Très bien, donc ce sont les types de choses que nous avons mises en œuvre et que nous avons testé afin que nous connaissions le comportement une fois que nous avons essayé le scénario dans la praticité. Donc, ce sont les différents niveaux de tests que nous avons traversés notre cycle rouge-vert, peuvent nous assurer que notre code était pare-balles dans toute la mesure que nous avons fait. Et puis sachez que lorsque le client teste, il aurait obtenu son document de test pour voir. Voici vos scénarios de test et assurez-vous que ce sont les résultats. Toute variation par rapport à cela entraînerait qu'ils voudraient vous dire de refactoriser. Donc, si je mets des invalides, cela voit le 18e mois de l'année et je clique sur Exécuter, cela va conduire à un crash. Donc oui, c'est toujours une mauvaise demande et oui, j'essaie d'obtenir quelques objets ici. Vous voyez que la valeur JSON n'a pas pu être convertie, mais ce n'est probablement pas ce qu'un utilisateur doit voir ou quelqu'un qui consomme l'API. Donc, à ce stade et tout votre service AQ reviendrait vers vous et vous dire, hé, vous savez, dans cette circonstance, s'il vous plaît appelez-les, ne l'a pas vu pour ça. Donc, vous revenez en arrière, vous écrivez un test pour vous assurer qu' un tel scénario n'existe pas ou qu'il se comporte de cette façon. Ou vous écrivez le test en fonction de la façon dont vous voulez qu'il se comporte. Et puis vous écrivez le code pour vous assurer qu'il le fait. Donc, en un mot, c'est un développement piloté par des tests avec C-Sharp. Quand nous reviendrons, nous pourrons faire un bref résumé de tout ce que nous avons vécu et terminer ensuite.
27. Examen du cours: D' accord les gars, donc vous êtes arrivé à la dernière conférence de ce cours. J' espère que vous avez développé vos connaissances sur le développement piloté par les tests avec botnet core. Et même si nous avons appris dotnet core ici, les principes fondamentaux de celui-ci peuvent être appliqués à n'importe quel autre framework ou tout autre langage que vous pourriez finir par utiliser. Vous avez une unité PHP pour le développement PHP, vous avez JUnit pour le développement Java, même Angelo et réagissez. Tous ont leur propre cadre de test unitaire et les principes sont les mêmes. développement piloté par les tests signifie que vous allez écrire le test unitaire va échouer. Vous écrivez le code et ensuite vous le faites transmettre. En faisant ce cycle, vous voyez comment vous avez besoin de Wonky, cher genre froid de séparation. Donc, ce que je voulais souligner, c'est que nous avons utilisé une séparation des préoccupations à tous les niveaux. Il a essayé de briser toutes les parties de notre application dans leurs propres projets. Donc, l'API était par elle-même. Le cœur, la logique métier était tout seul. Et puis nous avons eu les opérations liées aux données par eux-mêmes. manière générale, ce n'est qu'un modèle basé sur leur contexte. Vous pourriez vous retrouver avec plus ou même moins de projets. Mais le fait est que lorsque vous les avez décomposés dans ces tailles de perles sont des unités, il est beaucoup plus facile pour vous de tester les différentes couches de votre application pour vous assurer que chaque couche agit comme il se doit. Et puis le test unitaire lui-même s'assure que ce composant ou cette fonctionnalité de fonction dans ce composant ou dans cette couche agit comme il se doit. Nous avons donc la persistance avec toutes les opérations de données, avec le cœur, avec la logique métier, toutes les déclarations if et prendre les décisions. Est-ce qu'on admet cette date ou non, ce genre de choses ? Et puis nous ajoutons l'API, qui représente fondamentalement l'application. Ça aurait pu être une interface utilisateur. L' API en raison de la surcharge inférieure nécessaire avec l'interface utilisateur et ainsi de suite. Mais les principes de test et de développement restent à peu près les mêmes. long de ce parcours a également appris que dans les
tests unitaires , vous avez différents types de tests unitaires, des projets, au moins avec dotnet core, vous avez MSTest, qui est vanille, c'est directement de Microsoft. Avez-vous x unités et vous avez n unités ? Chacun a ses propres avantages et inconvénients. Dans ce discours, nous utilisons des unités x. Et nous avons vu que nous pouvions écrire des tests basés sur des tests, désolés, basés sur des données où nous créons une théorie et ensuite nous pourrions simplement passer des valeurs qui représentent les différents scénarios. Alors que dans d'autres cadres, il pourrait ne pas être facile avec mon difficile d'écrire un test unitaire pour le tournage et un R1 pour quand il est valide et bien que 14 et il est invalide. Et donc pour peut-être 23 tests que vous auriez écrits dans les autres frameworks, vous n'auriez écrit qu'un seul test, mais avec des données
différentes étant transmises pour les scénarios. Et pour moi, cela aide également à organiser le code parce que je dois être conscient et savoir que cette méthode ou représente ce que la méthode que je teste devrait faire. Donc, dans des circonstances différentes, quelle serait l'ancienne colonne ? Donc, dans mon esprit, cela m'a aidé à m'assurer que j'écris du code qui inclut les différents scénarios. Et écrivez aussi peu de code que possible, mais juste assez pour s'assurer que mes champs de test unitaires sont mon scénario se réalise réellement. Donc, nous avons fait des tests au niveau de l'application, nous avons fait la persistance des tests, et nous avons fait des tests de logique métier, et tous sont jusqu'à présent verts quand tout cela, quand nous nous foutons de ne pas introduire quelque chose à notre code. Nous voulons toujours nous assurer que les tests réussissent et que nous pouvons aller de l'avant. Donc, avec tout ce qui a été dit et fait, je vais juste vérifier les changements. Et c'est mon message. Alors je vais aller de l'avant et m'engager et couler. Et vous pouvez voir le dernier code source. Si vous en avez besoin dans les ressources. Merci de rester avec moi et je te verrai bientôt.