我有這個需要測驗的代碼
import Logger from './logger';
const logger = new Logger();
export function myFunction() {
// do something
logger.log('Hello');
}
如何測驗函式myFunction是否呼叫了 logger.log?這是我嘗試過但失敗的方法
jest.mock('./logger');
const mockedLoggerClass = <jest.Mock>Logger;
describe('Test myFunction', () => {
it('should call logger log', () => {
const loggerInstance = {
log: jest.fn()
}
mockedLoggerClass.mockReturnValue(() => loggerInstance);
myFunction()
expect(loggerInstance.log).toBeCalled; // Nope no call
});
})
這是另一個嘗試
const loggerInstance = {
log: jest.fn()
}
jest.mock('./logger', () => {
return function () {
return loggerInstance; // ReferenceError: Cannot access 'loggerInstance' before initialization
}
});
describe('Test myFunction', () => {
it('should call logger log', () => {
myFunction()
expect(loggerInstance.log).toBeCalled;
});
})
我知道我們不應該將記錄器初始化為全域范圍,但這不是我的代碼,所以我無法觸摸它。
uj5u.com熱心網友回復:
您loggerInstance和logger生產代碼中的 不是相同的參考。logger變數將在您匯入后立即創建myFunction,然后您必須獲取此 Logger 實體,而不是嘗試模擬另一個實體。
為此,您可以通過 jest 獲得一個模擬實體:
import { myFunction } from './index'; // a mocked logger already created
import Logger from './logger';
jest.mock('./logger'); // mock it
describe('myFunction', () => {
let logger: jest.Mocked<Logger>;
beforeEach(() => {
logger = (Logger as jest.Mock).mock.instances[0]; // get the mocked instance
});
it('should call Logger.log function with "Hello"', () => {
myFunction(); // action
expect(logger.log).toBeCalledWith('Hello'); // expectation
})
});
你在高組件(myFunction)中創建了一個依賴(logger),這是一種反依賴注入模式,這讓你的代碼變得難以測驗。您可以嘗試模塊模式,export default new Logger()而不是export default class Logger...
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/359946.html
上一篇:Angular單元測驗應該創建FAILEDTypeError:無法讀取未定義的屬性(讀取“首選項”)
下一篇:回應式文本HTML/CSS
