我正在測驗一個在內部具有方法的服務,但對外部源的功能進行了模擬。
在我的示例中,我有一個正在做一些處理的方法。如果驗證方法失敗,它將向外部服務發送警報(電子郵件、其他)。
我想測驗我的代碼是否會在應該呼叫警報時呼叫警報,但我顯然不希望它呼叫外部系統。
async Process(DateToProcess: number): Promise<void> {
const IsWeekend: boolean = IsSaturdayOrSunday(DateToProcess);
...
const DataToValidate$: Array<ResponseDTO> = await this.GetData(DateToProcess);
const IsValid$: boolean = await this.ValidateEntries(DataToValidate$);
if (! IsValid$) {
await this.CreateAlert('Data is Invalid');
}
}
我正在嘗試設定測驗,并使用存根提供外部服務。
const AlertDate = new ResponseDTO();
const mockAlertService = {
provide: AlertsService,
useFactory: () => ({
Create: jest.fn().mockResolvedValue(AlertData),
Delete: jest.fn().mockResolvedValue(null),
GetOne: jest.fn().mockResolvedValue(AlertData),
})
}
...
const module: TestingModule = await Test.createTestingModule({
providers: [
ValidateService,
mockAlertService,
],
}).compile();
service = module.get<ValidateDailyTimeEntriesService>(ValidateDailyTimeEntriesService);
AlertssTestService = module.get<AlertsService>(AlertsService);
此設定有效,我可以模擬回傳值。我在這里洗掉了其他服務,這些服務使用相同的格式并加載基本測驗資料,我可以驗證這些資料是否有效。
但是,我的測驗無法驗證是否呼叫了要創建的警報。
it('should send an alert if there are no times entries and it is not a weekend', async () => {
const spyProcess_: jest.SpyInstance = jest.spyOn(service, 'Process');
const spyGetData_: jest.SpyInstance = jest.spyOn(service, 'GetData').mockResolvedValue(TestData);
const spyValidateData_: jest.SpyInstance = jest.spyOn(service, 'ValidateData');
const spyCreateAlert_: jest.SpyInstance = jest.spyOn(service, 'CreateAlert').mockResolvedValue(true);
await service.Process(20221012); // Call the main function
expect(spyProcess_).toHaveBeenCalled(); // These 2 calls work, were called in the this test
expect(spyProcess_).toHaveBeenCalledWith(20221012);
expect(spyGetData_).toHaveBeenCalled(); // Works, this was called
expect(spyGetData_).toHaveReturnedWith(TestData);
expect(spyValidateData_).toHaveBeenCalled(); // This fails???
expect(spyCreateAlert_).toHaveBeenCalled(); // This will fail as well
spyCreateAlert_.mockClear();
spyValidateData_.mockClear();
spyGetData_.mockClear();
spyProcessOneDate_.mockClear();
});
該錯誤表明最后兩個間諜將不起作用,即使它們在我看來與那些做的風格相同。
expect(jest.fn()).toHaveBeenCalled()
Expected number of calls: >= 1
Received number of calls: 0
> 298 | expect(spyValidateData_).toHaveBeenCalled();
> 298 | expect(spyCreateAlert_).toHaveBeenCalled();
編輯 它與 async/await vs Promise 處理有關。如果我做:
async Process(): Promise<void> {
this.GetData(DateToProcess).then( (DataToValidate$: Array<ResponseDTO>) => {});
this.CreateAlert('Data is Invalid').then( (Result$: boolean) => {});
return;
}
測驗將通過。但是,使用 await 會失敗:
async Process(): Promise<void> {
const DataToValidate$: Array<ResponseDTO> = await this.GetData(DateToProcess);
const Result$: boolean = await this.CreateAlert();
return;
}
uj5u.com熱心網友回復:
我的問題與我正在做的處理有關。await/async 不能在具有回呼的回圈中運行,例如 forEach()。使用 for..of 格式,將糾正我遇到的錯誤。它需要對我撰寫的代碼進行一些重構,但它確實解決了這個問題。
我的簡單示例沒有顯示輔助函式中的回圈。因此,簡單的重寫將是:
const DataToValidate$: Array<ResponseDTO> = await this.GetData(DateToProcess);
DataToValidate$.forEach( (OneRecord: ResponseDTO) => {
const IsValid$: boolean = await this.ValidateEntries(OneRecord);
}
但是,VS Code 表明我在等待之前需要異步
const DataToValidate$: Array<ResponseDTO> = await this.GetData(DateToProcess);
DataToValidate$.forEach(async (OneRecord: ResponseDTO) => {
const IsValid$: boolean = await this.ValidateEntries(OneRecord);
}
但是,這不起作用,因為 forEach() 中的異步不起作用,因為 forEach 是一個回呼樣式回圈。
const DataToValidate$: Array<ResponseDTO> = await this.GetData(DateToProcess);
for (OneRecord of DataToValidate$) {
const IsValid$: boolean = await this.ValidateEntries(OneRecord);
}
這將允許適當的處理。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/524064.html
標籤:打字稿测试开玩笑的
上一篇:用mockk模擬通用頂級掛起函式
下一篇:模塊'@badeball/cypress-cucumber-preprocessor'沒有匯出成員'And'-TS2305
