I'm trying to use pg-mem with the pg-promise adapter for testing my database layer.
Initially I've tried fetching a fresh database for each test:
import { newDb } from 'pg-mem';
import {createTables} from './database';
export const getTestDatabase = async () => {
const database = await newDb().adapters.createPgPromise();
database.connect();
await createTables(database);
return database;
};
But then I get an annoying warning about duplicate database connections for each test:
WARNING: Creating a duplicate database object for the same connection
So I tried to use the backup and restore functions to return a restored database for each test:
import { newDb } from 'pg-mem';
import {createTables} from './database';
const mock = newDb();
let backup;
let database;
let databaseInitialized = false;
export const getTestDatabase = async () => {
if (!databaseInitialized) {
databaseInitialized = true;
database = await mock.adapters.createPgPromise();
database.connect();
await createTables(database);
backup = mock.backup();
} else {
backup.restore();
}
return database;
};
This mostly works, except that some of my tests alter the schema, at which point I get this error:
Context: Error: You cannot restore this backup: schema has been changed since this backup
has been created => prefer .clone() in this kind of cases
How do I use the clone function? I can't find any documentation.
What's the correct way to solve my problem?
You need to call
database.synchronize()before callingmock.backup().