如何用try和catch这样的函数来测试promise



由于某种原因,我无法测试拒绝。这是函数,我想100%测试它。现在是92%,抱怨不合格品(e)没有测试…

public resolve(): Promise<{ [key: string]: boolean }> {
return new Promise<{ [key: string]: boolean }>(async (resolve, reject) => {
try {
for await (const setting of settings) {
// ObjectStore that acts like hashMap
this.store.set(setting.key, setting.value);
}
resolve();
}
catch (e) {
reject(e);
}
});
}

更新:

我必须创建另一个Mock以使catch语句首先发生。和实验。overrideProvider不适合我,所以我必须

it('should return a rejected promise', async() => {
TestBed.resetTestingModule();
TestBed.configureTestingModule({ 
//inserting the new mock provider to trigger the catch 
... 
});

然后使用下面的答案(谢谢@Apoorva Chikara)并为我工作

如果有更简单的方法,请告诉我

这是我更新的测试代码。

it('should return a rejected promise', async() => {
TestBed.resetTestingModule();
TestBed.configureTestingModule({
providers: [
{
provide: ObjectStore,
useValue: new ObjectStore('test'),
},
{
// Making this client invalid to trigger catch and throw error
// I think writing a mock class to throw error also can be done
// this is the "settings" from azure listConfigurationSettings 
provide: AppConfigurationClient,
useValue: {},
}
]
});
service = TestBed.inject(FeatureFlagResolver);
store = TestBed.inject(ObjectStore);
const rejection = async () => {
await service.resolve().catch();
}
await expect(rejection()).rejects.toThrow();
});

"settings"是来自MS azure的listConfigurationSettings。我们过去常常从azure读取配置设置。例如,我们想在Angular站点中启用某些功能,我们可以去azure门户更改应用程序设置("chatbot", 'on'),这样聊天机器人就会出现在页面上。只是应用程序设置,人们现在需要切换打开,关闭。

对不起,我一开始就应该多加说明。

永远不要将async function作为执行人传递给new Promise!你的函数应该简化为

public async resolve(): Promise<{ [key: string]: boolean }> {
//     ^^^^^
for await (const setting of settings) {
// ObjectStore that acts like hashMap
this.store.set(setting.key, setting.value);
}
}

,然后你就不需要对根本不存在的代码路径进行单独的测试。

此外,您可能不想使用for await,除非settings是异步生成器。给出更新的细节,它实际上是一个PagedAsyncIterableIterator。但是,我建议不要将其存储在全局变量中,而是在完成.listConfigurationSettings()调用的同一函数中进行迭代。

可以捕获错误并进行测试。它类似于测试解析

describe('Test Case', () => {
describe('Testing Sample 1', () => {
it('should return a rejected promise', () => {
service.resolve()
.catch((error) => {
expect(error).toEqual('the error string');
});
});
});
});

相关内容

  • 没有找到相关文章

最新更新