Angular sürümündeki uygulamada, bileşenin çok sayıda css, başlık, bölüm ve sonunda 2 düğme içeren bir altbilgi ile bir modal olacağını görebiliriz. İskelet için, header, section, footer ve footer altındaki iki düğme ile div içeren bir yapıya başlayabiliriz.
feat/modalYesNo adlı bir dal oluşturun. src/components/ klasörü altında ModalYesNo.cy.tsx, ModalYesNo.tsx adında 2 dosya oluşturun. Her zamanki gibi, bileşenin render edilmesiyle başlayarak aşağıdakileri dosyalara kopyalayın ve yarn cy:open-ct ile runner'ı açtıktan sonra testi çalıştırın.
İşleri basit tutmak için, React TypeScript Cheatsheet adresinden orijinal tarifi kullanacağız, modal portal örneği. src/components/Modal.tsx oluşturun ve aşağıdaki kodu yapıştırın.
Bu biraz çıplak görünüyor. Angular sürümünden stilleri kopyalayalım ve birkaç etiket daha ekleyelim (Düzenleme 2). Önceki bölüme benzer şekilde, görsel yardımcılarla Düzenleme adımları için RedGreenDüzenleme döngüsü yapabiliriz.
Görseller gerçek şeye benziyor. Şimdi kalan şey biraz metin ve düğmeler için onClick işleyicileridir.
Modalda dört metin parçası vardır; başlık, mesaj ve düğmeler. Bu dizeleri kontrol eden başarısız bir test yazalım. Sert kodlanmış değerler kullanacağız ve daha sonra neyin parametreleştirilebileceğine karar vereceğiz (Red 3).
Görsellerle daha iyi bir değerlendirme yapabiliriz ve neyin parametrize edilmesi gerektiğine karar verebiliriz. Onayla, Hayır ve Evet büyük olasılıkla sabit kalır. Mesaj, eğer varsa, bir özellik olarak parametrize edilmelidir. Burada aracın bileşenin yeniden düzenlenmesinde ve tasarımında bize yardımcı olduğu önemlidir.
Testi, mesaj için bir özellik kabul edecek şekilde değiştiririz. Test geçer, ancak TS derleyicisi yeni eklenen özelliğe karşı bizi uyarıyor (Kırmızı 4). Burada TS'nin de RedGreenDüzenleme döngülerinde bize yardımcı olduğu önemlidir.
Evet ve Hayır düğmeleri için tıklama işleyicilerini ekleyelim. Bunların çağrılmasını sağlamak için özellikler geçirmemiz ve kullanmamız gerekecek. Başarısız bir test yazın (Kırmızı 5).
Sonraki döngü için, Hayır düğmesi için aynısını tekrarlayın. Her zaman olduğu gibi, başarısız olan testi önce yazın ve ardından bunu geçmesini sağlayacak kodu yazın (Kırmızı 6, Yeşil 6).
// src/components/ModalYesNo.cy.tsximport ModalYesNo from"./ModalYesNo";import"../styles.scss";describe("ModalYesNo", () => {it("should render the modal and call onClick handlers", () => {constmessage="Are you sure?";cy.mount( <ModalYesNomessage={message}onYes={cy.stub().as("onYes")}onNo={cy.stub().as("onNo")} /> );cy.get("#modal-root").should("exist");cy.get("div").last().within(() => {cy.get("header").contains("Confirm");cy.get("section").contains(message);cy.get("footer");cy.getByCy("button-yes").contains("Yes");cy.getByCy("button-no").contains("No"); });cy.getByCy("button-yes").click();cy.get("@onYes").should("be.called");cy.getByCy("button-no").click();cy.get("@onNo").should("be.called"); });});
Son düşünülmesi gereken özellik, modalın kullanımıdır. Açık veya kapalı olabilir. Genellikle bu, bir useState kancasıyla ele alınır, ancak bunun kullanımını bir testle çoğaltabiliriz. Boolean koşullu bir render içeren bir ana bileşen eklememiz gereken bir test ekliyoruz. Bu kenar durumunu kontrol etmemize izin veren bir yardımcı işlevle bir test ekliyoruz. Bunu çalıştırmak için yapmamız gereken tek şey, bileşenin en üst div öğesine bir data-cy özelliği eklemektir (Düzenleme 6).
// src/components/ModalYesNo.cy.tsximport ModalYesNo from"./ModalYesNo";import"../styles.scss";describe("ModalYesNo", () => {it("should render the modal and call onClick handlers", () => {constmessage="Are you sure?";cy.mount( <ModalYesNomessage={message}onYes={cy.stub().as("onYes")}onNo={cy.stub().as("onNo")} /> );cy.get("#modal-root").should("exist");cy.get("div").last().within(() => {cy.get("header").contains("Confirm");cy.get("section").contains(message);cy.get("footer");cy.getByCy("button-yes").contains("Yes");cy.getByCy("button-no").contains("No"); });cy.getByCy("button-yes").click();cy.get("@onYes").should("be.called");cy.getByCy("button-no").click();cy.get("@onNo").should("be.called"); });it("should not render the modal with if conditional render is false", () => {functionParentComponent():JSX.Element|boolean {return (false&& ( <ModalYesNomessage={"yo"}onYes={cy.stub().as("onYes")}onNo={cy.stub().as("onNo")} /> ) ); }// @ts-expect-error: replicating useStatecy.mount(<ParentComponent />);cy.getByCy("modal-yes-no").should("not.exist"); });});
// src/components/ModalYesNo.test.tsximport ModalYesNo from"./ModalYesNo";import { render, screen } from"@testing-library/react";import userEvent from"@testing-library/user-event";import"@testing-library/jest-dom";describe("ModalYesNo", () => {constmessage="Are you sure?";constonYes=jest.fn();constonNo=jest.fn();it("should render the modal and call onClick handlers",async () => {render(<ModalYesNomessage={message} onYes={onYes} onNo={onNo} />);awaitscreen.findByText("Confirm");awaitscreen.findByText(message);constbuttonYes=awaitscreen.findByTestId("button-yes");constbuttonNo=awaitscreen.findByTestId("button-no");expect(buttonYes).toBeVisible();expect(buttonNo).toBeVisible();awaituserEvent.click(buttonYes);expect(onYes).toHaveBeenCalled();awaituserEvent.click(buttonNo);expect(onNo).toHaveBeenCalled(); });it("should not render the modal with if conditional render is false",async () => {functionParentComponent():JSX.Element|boolean {returnfalse&& <ModalYesNomessage={"yo"} onYes={onYes} onNo={onNo} />; }// @ts-expect-error: replicating useStaterender(<ParentComponent />);expect(screen.queryByTestId("modal-yes-no")).not.toBeInTheDocument(); });});
Özet
İlk olarak, modal-root'un oluşturulduğunu kontrol eden basit bir testle başladık (Kırmızı 1).
Bir modal tarifi kullandık ve bunu bileşenimize içe aktardık (Yeşil 1).
Bileşenin iskeletine karar verdik ve bunun için bir test yazdık (Kırmızı 2).
Bileşeni stil ekleyerek yeniden düzenledik. Önceki bölümlerde olduğu gibi, yeniden düzenleme artışları için görsel yardımcılar kullandık (Düzenleme 3).
Modalda bulunan 4 metin parçasıyla başarısız bir test yazdık, sabit kodlanmış değerler kullanarak (Kırmızı 3)
Testi geçmek için sabit kodlanmış dizeleri ilgili etiketlere ekledik (Yeşil 3).
Bileşenin görselleriyle desteklenerek, dizelerden birini parametrize etmeye ve diğerlerini değiştirmeden bırakmaya karar verdik. Aracın bileşenin Düzenlemeünde olduğu kadar tasarımda da yardımcı olması önemliydi.
Parametrize edilmiş "mesaj" dizesi için bir özellik ekledik ve bunun için başarısız bir test yazdık (Kırmızı 4).
Bir prop türü eklemek, bileşene bir argüman eklemek ve değeri işlev dönüşünde / oluşturmada kullanmak şeklindeki modeli izledik.
Evet ve Hayır düğmeleri için tıklama işleyici testleri ekledik (Kırmızı 5, 6) ve bileşene özelliklerle birlikte türler, argümanlar ve onClick nitelikleri ekledik (Yeşil 5, 6).
Bileşenin koşullu oluşturma ile kullanılabilmesini sağlamak için, bileşen testinde bir yardımcı işlev, boolean koşullu oluşturma içeren bir üst bileşen oluşturduk (Düzenleme 6).
Ana Fikirler
Bileşen testinin görsel sonuçları, bileşeni yeniden düzenlemeye ve tasarlamaya yardımcı olabilir.
Birinci bölümde de gördüğümüz gibi, TypeScript ve ESlint de bize Kırmızı veren "testler" olarak hizmet edebilir.