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
