使用Jest,Typescript,React,MobX,我尝试在Jest中测试以下功能:
search(searchText: string) : Promise<void> {
this.searchInputCache = searchText;
this.searchLoading = true;
const promises = [] as Promise<any>[];
const results = {} as {[itemType in DatabaseItemType]: DatabaseItemRef[]};
for (const [item, checked] of this.filterChecks.entries()) {
if (checked) {
promises.push(SearchService.searchForItem(this._rootStore.databaseStore, searchText, item as DatabaseItemType, SearchTypeFlags.nxSearchType_Name)
.then(values => results[item] = values));
}
}
return Promise.all(promises).then(() => this.populateFilterTreeStore(results));
我已经尝试过用await测试它,但是我正在尝试测试内部函数是否正确地这样调用:
it('searches', () => {
filterTreeStore.filterChecks.set(DatabaseItemType.Signal, true);
filterTreeStore.filterChecks.set(DatabaseItemType.Frame, true);
filterTreeStore.filterChecks.set(DatabaseItemType.ECU, false);
filterTreeStore.filterChecks.set(DatabaseItemType.PDU, false);
filterTreeStore.filterChecks.set(DatabaseItemType.Cluster, false);
const searchText = 'a';
filterTreeStore.search('a').then(() => expect(searchMock).toBeCalledWith(databaseStore, searchText, DatabaseItemType.Signal,SearchTypeFlags.nxSearchType_Name))
});
最终,我不断收到TypeError:无论我尝试了什么,都无法读取未定义的属性'then'。
79 | for (const [item, checked] of this.filterChecks.entries()) {
80 | if (checked) {
> 81 | return promises.push(SearchService.searchForItem(this._rootStore.databaseStore, searchText, item as DatabaseItemType, SearchTypeFlags.nxSearchType_Name)
| ^
82 | .then(values => results[item] = values));
83 | }
84 | } `
任何有关如何测试此功能的建议都将受到赞赏!
答案 0 :(得分:0)
searchMock需要具有返回值-这解决了该问题。
const itemType = DatabaseItemType.Signal;
const mockSearchResults =
new MakeListCommand(
mockSignalrefs,
{ itemType, name: getDisplayNameForItemType(itemType) },
{ ancestorRefs: [] },
true);
searchMock.mockReturnValue(Promise.resolve(mockSearchResults));