我在 nodejs 中使用 jest 并為我的模型進行續集。對于我的測驗,我想模擬 的回傳值findAll以覆寫測驗場景。對不起,如果這是一個非常新手的問題,但我在這個問題上處于死胡同。
init-models.js
module.exports = function initModels(sequelize) {
//model relationship code here
...
...
//end of model relationship code
return {
records,
anotherModel,
alsoAnotherModel
};
};
存盤庫.js
const sequelize = require('../sequelize');
const initModels = require('../model/init-models');
let {
records,
anotherModel,
alsoAnotherModel
} = initModels(sequelize);
const fetchRecords = async () => {
console.info('Fetching records...');
return await records.findAll({sequelize parameters here});
}
repository.test.js這將作業,但需要靈活地模擬findAll()回傳值/或拋出錯誤
const repository = require('../../../src/db/repository/repository');
const initModels = require('../../../src/db/model/init-models');
jest.mock('../../../src/db/model/init-models', () => {
return function() {
return {
records: {
findAll: jest.fn().mockImplementation(() => [1,2,3])
}
//the rest of the code for other models
}
}
});
describe('fetchRecords', () => {
beforeEach(()=> {
});
test('should return correct number of records', async () => {
const result = await repository.fetchRecords();
expect(result.size).toStrictEqual(3); //test passed
});
})
為了模擬 的結果findAll,我嘗試提取它,以便我可以更改每個測驗場景的結果,但它不起作用。我錯過了什么?
const mockRecordsFindAll = jest.fn();
jest.mock('../../../src/db/model/init-models', () => {
return function() {
return {
records: {
findAll: () => mockRecordsFindAll
}
//the rest of the code for other models
}
}
});
describe('fetchRecords', () => {
beforeEach(()=> {
mockRecordsFindAll.mockReset()
});
test('should return correct number of records', async () => {
mockRecordsFindAll.mockImplementation(() => [1,2,3]); //should expect length 3
const result = await repository.fetchRecords();
expect(result.size).toStrictEqual(3); //fails, findAll was not mocked
});
})
uj5u.com熱心網友回復:
問題是mockRecordsFindAll回傳而不是執行。由于@Gid 機器剛剛回傳mockRecordsFindAll導致初始化問題(由于提升)。
這種情況的解決方案是使用decorator pattern允許mockRecordsFindAll之后進行初始化。
const mockRecordsFindAll = jest.fn();
jest.mock('../../../src/db/model/init-models', () => {
return function() {
return {
records: {
findAll: function () {
return mockRecordsFindAll.call(this, arguments);
}
}
}
}
});
describe('fetchRecords', () => {
...
})
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/324873.html
標籤:节点.js 单元测试 玩笑 sequelize.js
