Mocka en klass i TypeScript med Jest


Jag försöker enhetstesta (med Jest) min hanterarmodul som använder en sammanfattningsklass.

Min ursprungliga sammanfattningsklass ser ut så här:

import DynamoDBClient from './ddbClient/DynamoDBClient'
import { DynamoDB } from 'aws-sdk'
import { iSummaryReader, iObsSummariesAttributes } from './Summary.d'
import { JSONAPIResource } from '../JSONAPIResponse'

export default class Summary {
  reader: iSummaryReader

  constructor(reader: iSummaryReader) {
    this.reader = reader
  }


  getSummary = async (keyName: string, keyValue: string): Promise<JSONAPIResource<iObsSummariesAttributes>> => {
    return new Promise<JSONAPIResource<iObsSummariesAttributes>>((resolve, reject) => {
      const gettingItem = this.reader.getItem(keyName, keyValue)
      console.log(gettingItem)
      gettingItem.then((resp) => {
        resolve(resp)
      }).catch((err: Error) => {
        reject(err.message)
      })
    })
  }
}

I min hanteringsmodul importerar jag med import Summary from './lib/Summary' (Obs: samma rad används i handler.test.ts

Inuti handlarefunktionen

try {
  const dynamodbObj: iSummaryReader = new DynamoDBClient(documentClient, someTable)
  const summary = new Summary(dynamodbObj)
  const data: JSONAPIResource<iObsSummariesAttributes> = await summary.getSummary('id', someID)
}

Mina resultat beror på mitt tillvägagångssätt om jag försöker en automatisk simulering

jest.mock('./lib/Summary', () =>
{
  return {
    getSummary: jest.fn()
  }
})

Jag får felet

TypeError: Summary_1.default är inte en konstruktor

Om jag skapar en manuell mock under lib/__mocks__/Summary.ts med jest.mock('./lib/Summary') fungerar det tills jag når den punkten

expect(Summary).toHaveBeenCalledTimes(1)

Där det klagar på att jag inte kan göra detta i sammanfattningen. Jag kan inte heller komma åt min metod för att testa att de kallas på detta sätt.

Observera: Min hanterare är för en lambda-funktion, så jag kan inte injicera klassen på det sättet där jag har framgångsrikt testat att jag kan mocka en injicerad klass.

REDIGERA

tsconfig.json är:

{
  "compilerOptions": {
    "rootDir": "./src",
    "outDir": "./build",
    "declaration": false,
    "target": "es2015",
    "moduleResolution": "node",
    "module": "commonjs",
    "noImplicitReturns": true,
    "noImplicitThis": true,
    "strictNullChecks": true,
    "alwaysStrict": true,
    "lib": [
      "dom",
      "es2015.promise",
      "es2017.object",
      "es2016"
    ],
  },
  "include": [
    "src/**/*.ts"
  ],
}

Svar #1

Jag vet inte varför detta misslyckades, men följande steg verkar fungera för att åtgärda det.

  1. Ändra klassens export från standard

Från

`export default class Summary {`

till

`class summary`

+ export=summary i slutet

  1. Använd import=require för att importera det.

    import Summary = require('./lib/Summary')

De där två ändringarna gjorde att det kunde hitta jest.mock.

Relaterade artiklar