Cypress tilpasset TypeScript-kommando er ikke en funksjon


Jeg implementerer en tilpasset Cypress-kommando i TypeScript:

// support/commands.ts
const login = () => {
    console.log('Logging in...');
};

Cypress.Commands.add('login', login);

declare namespace Cypress {
    interface Chainable {
        login: typeof login;
    }
}

Jeg prøver å ringe det ved å bruke:

describe('Login Scenario', () => {
    it('should allow a user to login', () => {
        cy.visit('/');
        cy.login();
    });
});

Likevel ser det ut til at kommandoen ikke er satt opp:

TypeError: cy.login is not a function

Hvis jeg skriver kommandoen i ren JavaScript (ved å fjerne navneområdet og oppdatere kallet til (cy as any).login();, fungerer det.

Hva går jeg glipp av?

Svar #1

Jeg løste det ved å legge til index.d.ts-filen i kommandomappen min. I denne filen la jeg til noe slikt:

import { MyCustomType } from '../Types';

declare global {
  namespace Cypress {
    interface Chainable<Subject = any> {
      login(): Chainable<MyCustomType>;
    }
  }
}

Hvis du ikke importerer eller eksporterer noe, bare utelat deklarasjonen av globalt navnerom:

declare namespace Cypress {
  interface Chainable<Subject = any> {
    login(): Chainable<MyCustomType>;
  }
}

Husk at det ikke vil fungere med Typescript < 2.3, fordi standard generiske typer må støttes.

Svar #2

Jeg hadde det samme problemet, og alle løsninger jeg fant fungerte ikke for meg. Etter å ha gjort alt fra den offisielle Cypress-dokumentasjonen og andre løsninger her, fikk jeg fortsatt feilen cy.login er not a function.

Problemet var at jeg omdøpte hver .js-fil til .ts og cypress/support/index.ts ble ikke lastet lenger, fordi Cypress som standard bare laster JavaScript-filen. For å fikse det må du endre det til .ts i cypress.json slik (det samme gjelder plugins-filen):

{
  "supportFile": "cypress/support/index.ts",
  "pluginsFile": "cypress/plugins/index.ts"
}

Du kan også legge til delen med declare namespace Cypress {... i commands.ts i stedet for å opprette en index.d.ts-fil, for å ha deklarasjonen og implementeringen i samme fil

Relaterte artikler