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.
- Ändra klassens export från standard
Från
`export default class Summary {`
till
`class summary`
+ export=summary i slutet
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.
