Environment:
CentOS Linux release 7.3.1611 (Core)
node v8.16.0
jest 24.8.0
jest-when version 2.7.0
The below jest unit test example uses jest-when to have two different parameterized mock return values for a method (db.runQuery) that is called twice but has different return values to simulate two different database calls.
const runDbQuery = async(sql, params) => {
// this is the external dependency call that needs to be mocked
const dataSet = await db.runQuery(sql, params);
return dataSet;
};
const retrieveData = async(params) => {
const data1 = await runDbQuery(QUERY1, [params]);
const data2 = await runDbQuery(QUERY2, [data1]);
// some manipulation of data...
const returnData = <some manipulation of data>;
return returnData;
};
Unit test for unit:
const { when } = require('jest-when')
// import external dependencies for mocking
const db = require('./db');
const unit = require(<unit under test js file>)(db);
test('Test retrieveData', async () => {
///////////////////
// db call 1 setup
///////////////////
// first db.runQuery mock setup
const params1_var1 = 5;
const params1_var2 = "five";
const paramsJson1 = JSON.stringify({
params1_var1: params1_var1,
params1_var2: params1_var2,
});
const params1 = [paramsJson1];
const returnData1_var1 = 99;
const returnData1_var2 = "ninety-nine";
const returnData1_var3 = true;
const returnData1 = [
{
returnData1_var1: returnData1_var1,
returnData1_var2: returnData1_var2,
returnData1_var3: returnData1_var3,
}
];
// format returned from db call
const dataSets1 = {
rows: returnData1,
};
const query1 = QUERY1;
///////////////////
// db call 2 setup
///////////////////
// second db.runQuery mock setup
const params2_var1 = 22;
const params2 = [params2_var1];
// county query is different
const query2 = QUERY2;
const returnData2_var1 = 100;
const returnData2_var2 = "one-hundred";
const returnData2 = [
{
returnData2_var1: returnData2_var1,
returnData2_var2: returnData2_var2
}
// format returned from db call
const dataSets2 = {
rows: returnData2,
};
/ external dependency method call that needs to be mocked
const mockDbRunQuery = db.runQuery = jest.fn().mockName('mockDbRunQuery');
// first call to db.runQuery
when(db.runQuery).calledWith(query1, params1).mockResolvedValue(dataSets1);
// second call to db.runQuery
when(db.runQuery).calledWith(query2, params2).mockResolvedValue(dataSets2);
const retrieveDataReturnVal = {
...
};
await expect(unit.retrieveData(params)).resolves.toStrictEqual(retrieveDataReturnVal);
// verify that mock method(s) were expected to be called
expect(mockDbRunQuery).toHaveBeenCalledTimes(2);
});
No comments:
Post a Comment
I appreciate your time in leaving a comment!