No puedo probar el rechazo por alguna razón. Aquí está la función y quiero probarla al 100%. ahora es como el 92% y se queja de que el rechazo (e) no se prueba.
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); } }); }Actualizaciones:
Tengo que hacer otro simulacro para que la declaración de captura suceda primero. Y TestBed.overrideProvider realmente no funciona para mí, así que tengo que
it('should return a rejected promise', async() => { TestBed.resetTestingModule(); TestBed.configureTestingModule({ //inserting the new mock provider to trigger the catch ... });y luego use la respuesta a continuación (Gracias @Apoorva Chikara) y funciona para mí
Si hay una manera más fácil de lograr esto, por favor hágamelo saber
Aquí está mi código actualizado para probar.
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(); });La "configuración" es listConfigurationSettings de MS azure. solíamos leer desde Azure para los ajustes de configuración. Por ejemplo, queremos habilitar ciertas cosas en el sitio de Angular, podemos ir a Azure Portal para cambiar la configuración de la aplicación ("chatbot", 'on'), para que el chatbot esté en la página. Solo configuración de la aplicación que las personas pueden activar o desactivar por ahora.
Lo siento, debería haber incluido más información en primer lugar.
¡ Nunca pase una async function como ejecutora de new Promise ! Su función debe simplificarse a
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); } }y luego no necesitará una prueba separada para la ruta del código que ni siquiera existe.
Además, probablemente no quiera usar Dados los detalles actualizados, en realidad es un for await , a menos que la settings sea un generador asíncrono.PagedAsyncIterableIterator . Sin embargo, recomendaría no almacenar eso en una variable global, sino hacer la iteración en la misma función donde se realiza la llamada .listConfigurationSettings() .
Puede detectar el error y probarlo. Es similar a probar la resolución.
describe('Test Case', () => { describe('Testing Sample 1', () => { it('should return a rejected promise', () => { service.resolve() .catch((error) => { expect(error).toEqual('the error string'); }); }); }); });