Search code examples
reactjstypescriptjestjscreate-react-app

Testing Typescript Interface with Jest


Below is my interface and test file. When I run jest tests against it for code coverage, it keeps saying that lines 1 and 2 are not covered by the tests. Is code coverage for interfaces something that is even possible? Or should I exclude any interfaces from the coverage reports?

index.tsx

export interface StoreState {
    languageName: string;
    enthusiasmLevel: number;
}


index.test.tsx

import { StoreState } from '../types';

it('has a languageName of "TypeScript"', () => {
    const state: StoreState = { languageName: 'TypeScript', enthusiasmLevel: 3 };
    expect(state.languageName).toEqual('TypeScript');
});

it('has an enthusiasm level of 3', () => {
  const state: StoreState = { languageName: 'TypeScript', enthusiasmLevel: 3 };
  expect(state.enthusiasmLevel).toEqual(3);
});

Solution

  • This is a known issue with ts-jest (Issue #378). The project owners currently recommend excluding interface files from Jest coverage:

    kulshekhar commented on Jan 1, 2018:

    I don't think there's anything that can be done in ts-jest to fix this. I've taken a closer look at this issue and there are two ways to get the desired outcome:

    • exclude files that contain only types from coverage
    • add and export a dummy function/variable from a file that contains only types

    When TypeScript transpiles files, it doesn't convert 'pure type' imports to require statements. This results in Jest not picking and passing those files to ts-jest.

    GeeWee commented on Jan 2, 2018:

    I don't think we can exclude files that contain only types. I also think this is a wontfix unless jest adds the capabillity for transformers to opt files out of coverage or something akin to that.

    For example, you could use coveragePathIgnorePatterns to exclude files based on a naming convention for files that contain only types (e.g., an I prefix followed by a capital letter, such as "ISerializable"):

    {
      "jest": {
        ...
        "coveragePathIgnorePatterns": [
          "**/I[A-Z]*.{ts}"
        ]
      }
    }