Jest's expect.objectContaining() fails in expect.toHaveBennCalled()

Viewed 4397

I'm trying to write a test to vlaidate code that writes to DynamoDB with aws-sdk. Despite a very similar use case being presented in the offical docs (https://jestjs.io/docs/en/expect#expectobjectcontainingobject), my assertion fails. Any help appreciated.

This is my test:

test("givenCprRepositoryServiceTestSuite_whenSaveCprRecord_thenMetaExpiresAtAppended", async () => {
        await cprRepositoryService.saveCprRecord({cprNumber: existingCpr, firstName: "Jens", lastName: "Jensen"})

        expect(aws.DynamoDB.DocumentClient.prototype.put).toHaveBeenCalledWith(
            expect.objectContaining({
                Item: {
                    metaExpiresAt: expect.any(Number)
                }
            }))
    })

And the error returned is:

Error: expect(jest.fn()).toHaveBeenCalledWith(...expected)

Expected ObjectContaining:

{"Item": {"metaExpiresAt": Any<Number>}}

Received:

{"Item": {"cprNumber": "1234567890", "firstName": "Jens", "lastName": "Jensen", "metaExpiresAt": 1570792526}, "TableName": "CountryLayer_Cpr"}

1 Answers

The expect.objectContaining(object) method cannot handle nested objects. To resolve this problem, I'd recommend the following modifications to your code.

test("givenCprRepositoryServiceTestSuite_whenSaveCprRecord_thenMetaExpiresAtAppended", async () => {
        await cprRepositoryService.saveCprRecord({cprNumber: existingCpr, firstName: "Jens", lastName: "Jensen"})

        expect(aws.DynamoDB.DocumentClient.prototype.put).toHaveBeenCalledWith(
            expect.objectContaining({
                Item: expect.objectContaining({
                    metaExpiresAt: expect.any(Number)
                })
            }))
    })
Related