javascript - Mock et globalt objekt med Jest og Typescript


Jeg har en React-komponent. For godt eller vondt, bruker jeg Routes-det globale objektet som tilbys av js-routes - en gem for Rails. Jeg har en snapshot-test som bruker Jest, som tester min enkle komponent som tilfeldigvis bruker Routes-det globale objektet.

I min test vil jeg mocke Routes. Så når komponenten min kaller Routes.some_path(), kan jeg bare returnere en vilkårlig streng.

Feilen jeg hovedsakelig får er Cannot find name 'Routes'..

Her er min oppsett:

package.json

"jest": {
  "globals": {
    "ts-jest": {
      "enableTsDiagnostics": true
    }
  },
  "testEnvironment": "jsdom",
  "setupFiles": [
    "<rootDir>/app/javascript/__tests__/setupRoutes.ts"
  ]
...

setupRoutes.ts (Dette virket som den mest populære løsningen)

const globalAny:any = global;

globalAny.Routes = {
  some_path: () => {},
};

myTest.snapshot.tsx

import * as React from 'react';
import {shallow} from 'enzyme';
import toJson from 'enzyme-to-json';

import MyComponent from 'MyComponent';

describe('My Component', () => {
  let component;

  beforeEach(() => {
    component = shallow(<MyComponent />);
  });

  it('should render correctly', () => {
    expect(toJson(component)).toMatchSnapshot();
  });
});

MinKomponent.tsx

import * as React from 'react';
import * as DOM from 'react-dom';

class MyComponent extends React.Component<{}, {}> {

  render() {
    return <div>{Routes.some_path()}</div>;
  }
}

export default MyComponent;

Hvis jeg console.log(window) i testen, eksisterer Routes. Så jeg er ikke sikker på hvorfor det ikke liker at Routes brukes i komponenten. Faktisk må det være Typescript som tror det ikke eksisterer, men ved kjøring eksisterer det. Jeg antar at spørsmålet mitt da er hvordan jeg kan få Typescript til å slappe av når det gjelder Routes?

Svar #1

I setupRoutes.ts

(global as any).Routes = {
  some_path: () => {}
};

Relaterte artikler