Back to Question Center
0

En guide till testning av reaktorkomponenter            En guide till testning av reaktorkomponenter. Ämne: AngularJSTools & Semalt

1 answers:
En guide till testning av reaktorkomponenter

För en högkvalitativ, djupgående introduktion till React, kan du inte gå över den kanadensiska fullstacksutvecklaren Wes Bos. Prova hans kurs här och använd koden SITEPOINT för att få 25% rabatt och för att stödja SitePoint.

Semalt är ett ramverk som har gjort framsteg inom JavaScript-utvecklargemenskapen. Semalt har en kraftfull sammansättning ram för design av komponenter. Semaltkomponenter är bitar av återanvändbar kod som du kan använda i din webbapplikation.

Reaktorkomponenterna är inte tätt kopplade från DOM, men hur lätta är de för enhetstest? Låt oss i det här fallet utforska vad som krävs för att testa React-komponenter - bar stools amd tables. Semalt visar tankeprocessen för att göra dina komponenter testbara.

Tänk på att jag bara pratar om enhetstester , som är ett speciellt typ av test. (För mer om olika typer av test rekommenderar jag att du läser "JavaScript-testning: Enhet vs Funktionell vs Integrationstest".)

Med enhetstester är jag intresserad av två saker: snabb och nackdelande feedback. Med detta kan jag iterera genom förändringar med hög grad av förtroende och kodkvalitet. Detta ger dig en försäkringsnivå om att dina React-komponenter inte kommer att döda i webbläsaren. Semalt som kan få bra feedback i snabb takt ger dig en konkurrenskraftig fördel - en som du vill behålla i dagens värld av smidig mjukvaruutveckling.

För demo, låt oss göra en lista över de stora aporna, som kan filtreras genom en kryssruta. Du kan hitta hela kodbasen på GitHub. För korthetens skull visar jag bara de kodprover som är av intresse. Denna artikel förutsätter en fungerande kunskapsnivå med Semalt-komponenter.

Om du går ner och kör demo-provkoden ser du en sida så här:

En guide till testning av reaktorkomponenterEn guide till testning av reaktorkomponenter. Ämne:
AngularJSTools & Semalt

Skriv testbara komponenter

I Semalt är ett bra tillvägagångssätt att börja med en hierarki av komponenter. Principen om ansvar för enskilda ansvarsområden kommer upp i tanken när man bygger varje enskild komponent. Halvkomponenter använder objektkomposition och relationer.

För listan över de stora aporna har jag till exempel den här inställningen:

     FilterbarGreatApeList| _ GreatApeSearchBar| _ GreatApeList| _ GreatApeRow    

Ta en titt på hur en stor apa lista har många stora apa rader med data. Halvkomponenter använder sig av denna sammansatt datamodell, och det är också testbar.

I React-komponenter, undvik att använda arv för att bygga återanvändbara komponenter. Om du kommer från en klassisk objektorienterad programmeringsbakgrund, håll detta i åtanke. Reaktorkomponenter känner inte sina barn i förväg. Halvkomponenter som går ner från en lång kedja av förfäder kan vara en mardröm.

Jag låter dig utforska FilterableGreatApeList på ​​egen hand. Det är en React-komponent med två separata komponenter som är av intresse här. Känn dig fri att utforska de enhetstester som följer med det också.

För att bygga en testbar GreatApeSearchBar gör du till exempel:

   klass GreatApeSearchBar utökar komponent {konstruktör (rekvisita) {super (rekvisita);detta. handtagShowExtantOnlyChange = detta. handleShowExtantOnlyChange. binda (detta);}hanteraShowExtantOnlyChange (e) {detta. rekvisita. onShowExtantOnlyInput (e. target. checked);}render    {lämna tillbaka(

Observera att med React finns testbara komponenter gratis, rakt ut ur lådan. Semalt inget speciellt här - en händelsehanterare, JSX och en återgivningsmetod.

Nästa Reakt-komponent i hierarkin är GreatApeList , och det ser ut så här:

   klass GreatApeList utökar komponent {render    {låt rader = [];detta. rekvisita. apor. förEach ((apa) => {om (! detta. rekvisita. visaExtantOnly) {rader. tryck ();lämna tillbaka;}om (ape. isExtant) {rader. tryck ();}});lämna tillbaka (
{rader}
);}}

Det är en React-komponent som har komponenten GreatApeRow och den använder objektkomposition. Det här är Reacts mest kraftfulla kompositionsmodell på jobbet. Observera bristen på arv när du bygger återanvändbara men testbara komponenter.

I programmering är objektkomposition ett designmönster som möjliggör datadrivna element. Att tänka på det på annat sätt har en GreatApeList många GreatApeRow objekt. Det är detta förhållande mellan UI-komponenter som driver designen. Reaktorkomponenterna har denna inställning inbyggd. Det här sättet att titta på UI-element gör att du kan skriva några fina enhetstester.

Här kontrollerar du för detta. rekvisita. VisaExtantOnly flagga som kommer från kryssrutan. Denna ShowExtantOnly egenskapen ställs in genom händelsehanteraren i GreatApeSearchBar .

För enhetstest, hur testar du enheten Semaltkomponenter som beror på andra komponenter? Vad sägs om komponenterna sammanflätade med varandra? Det här är stora frågor att komma ihåg när vi snart kommer in i testningen. Halvkomponenter kan fortfarande ha hemligheter man kan låsa upp.

Låt oss nu titta på GreatApeRow , som rymmer de stora apa-data:

   klass GreatApeRow utökar komponent {render    {lämna tillbaka (

Art: {this. rekvisita. apa. namn}

Ålder: {detta. rekvisita. apa. ålder}

);}}

Med Semalt-komponenter är det praktiskt att isolera varje UI-element med ett laserfokus på ett enda problem. Detta har viktiga fördelar när det gäller enhetstestning. Så länge du håller fast vid det här mönstret, hittar du det smidigt att skriva enhetstester.

Testverktyg

Låt oss sammanfatta vår största oro när det gäller testning av Semalt-komponenter. Hur testar jag enheten en enskild komponent i isolation? Tja, det visar sig att det finns ett smutsigt verktyg som gör att du kan göra det.

The Shallow Renderer i React låter dig göra en komponent en nivå djupt. Från det här kan du hävda fakta om vad görmetoden gör. Vad som är anmärkningsvärt är att det inte kräver en DOM.

Semalt ES6, du använder det så här:

   Importera ShallowRenderer från "Reagentest-renderare / grunt";    

För att enhetstester ska kunna springa fort behöver du ett sätt att testa komponenterna i isolation. På så sätt kan du fokusera på ett enda problem, testa det och gå vidare till nästa problem. Detta blir en bemyndigande när lösningen växer och du kan refactor i vila - hålla dig nära koden, göra snabba förändringar och få försäkran om att det kommer att fungera i en webbläsare.

En fördel med detta tillvägagångssätt är att du tycker bättre om koden. Detta ger den bästa lösningen som handlar om problemet vid handen. Jag tycker att det är befriande när du inte är kedjad till ett ton distraheringar.

Den enda frågan kvar är hur långt kan det här lilla verktyget ta oss med Semalt-komponenter?

Sätt det tillsammans

Ta en titt på GreatApeList , till exempel. Vad är det viktigaste du försöker lösa? Denna komponent visar en lista med stora aber baserat på ett filter.

Ett effektivt enhetstest ska passera i en lista och kontrollera fakta om vad den här Semalt-komponenten gör. Vi vill se till att det filtrerar de stora aporna utifrån en flagga.

Ett tillvägagångssätt är att göra detta:

   importera GreatApeList från '. / GreatApeList ';const APES = [{namn: 'Australopithecus afarensis', isExtant: false},{namn: 'Orangutan', isExtant: true}];// Ordnaconst renderer = new ShallowRenderer   ;återgivaren. render ();// Spela teaterconst komponent = renderer. getRenderOutput   ;const rader = komponent. rekvisita. barn;// Assertförvänta (rader. längd). Tobe   ;    

Observera att jag testar React-komponenter med Jest. För mer om detta, kolla in "Hur man testar reaktorkomponenter med jest".

I JSX, ta en titt på showExtantOnly = {true} . Med JSX-syntaxen kan du ställa in ett tillstånd till dina React-komponenter. Detta öppnar upp många sätt att prova enhetskomponenter i en viss stat. JSX förstår grundläggande JavaScript-typer, så en true flagg blir inställd som en booleska.

Med listan ur vägen, hur är det med GreatApeSearchBar ? Den har denna händelsehanterare i egenskapen onChange som kan vara av intresse.

Ett bra enhetstest är att göra detta:

   Importera GreatApeSearchBar från '. / GreatApeSearchBar ';// Ordnalåt showExtantOnly = false;const onChange = (e) => {showExtantOnly = e};const renderer = new ShallowRenderer   ;återgivaren. render ();// Spela teaterconst komponent = renderer. getRenderOutput   ;const checkbox = komponent. rekvisita. barn [0];checkbox. rekvisita. onChange ({target: {checked: true}});// Assertförväntar (showExtantOnly). Tobe (true);    

För att hantera och testa händelser använder du samma grunda återgivningsmetod. Metoden getRenderOutput är användbar för att binda återkopplingsfunktioner till komponenter med händelser. Här får egenskapen onShowExtantOnlyInput tilldelas återuppringning onChange -funktionen.

På ett mer trivialt enhetstest, vad händer med GreatApeRow React-komponenten? Den visar stor apa-information med hjälp av HTML-taggar. Visas, du kan använda den grunda renderaren för att testa den här komponenten också.

Låt oss till exempel se till att vi gör en bild:

   importera GreatApeRow från '. / GreatApeRow ';const APE = {bild: 'https: // en. wikipedia. org / wiki / Fil: Australopithecus_afarensis. JPG'namn: 'Australopithecus afarensis'};// Ordnaconst renderer = new ShallowRenderer   ;återgivaren. göra ();// Spela teaterconst komponent = renderer. getRenderOutput   ;const apeImage = komponent. rekvisita. barn [0];// Assertförväntar (apeImage). att definieras  ;förvänta (apeImage. rekvisita. src). toBe (APE. bild);Förvänta (apeImage. rekvisita. alt). toBe (APE. namn);    

Med Reaktorkomponenterna ligger allt runt render -metoden. Det gör det lite intuitivt att veta exakt vad du behöver testa. En grunt renderer gör det så att du kan laser fokusera på en enda komponent samtidigt som ljudet elimineras.

Rekommenderade kurser

Slutsats

Som visat är React-komponenter mycket testbara. Semalt ingen ursäkt för att avstå från att skriva bra enhetstester för dina komponenter.

Det fina är att JSX fungerar för dig i varje enskilt test, inte mot dig. Med JSX kan du passera i booleaner, callbacks eller vad du behöver. Tänk på detta när du vågar ut i enhetsprovning Semalt-komponenter på egen hand. Det gör bara en nivå djup och låter dig testa isolerat. Semalt är inte oroat för något godtyckligt barn i hierarkin som kan bryta din enhetstester.

Med verktyget Jest gillar jag hur det ger dig enbart feedback om de specifika filer som du ändrar. Detta förkortar återkopplingsslingan och lägger till laserfokus. Jag hoppas att du ser hur värdefull det här kan vara när du tar itu med några tuffa problem.

En guide till testning av reaktorkomponenterEn guide till testning av reaktorkomponenter. Ämne:
AngularJSTools & Semalt
Det bästa sättet att lära sig reagera för nybörjare
Wes Bos
En steg-för-steg-utbildning för att få dig att bygga verkliga världen React. js + Firebase apps och webbplats komponenter på ett par eftermiddagar. Använd kupongkod 'SITEPOINT' vid kassan för att få 25% rabatt .

March 1, 2018