2017-08-23 1 views
1

J'essaie de tester un de mes modules de fonctionnalités, mais j'ai des difficultés. Mon dernier test échoue parce que l'espion ne pense pas que la méthode est appelée. Pas même si je déplace l'appel this.translate.use(this.currentLanguage.i18n) en dehors du bloc d'abonnement.Angulaire - l'espion ne reconnaît pas la fonction en cours d'appel

C'est le composant caractéristique:

export class LanguagesComponent implements OnDestroy, OnInit { 

    public languages = [ 
    { 
     id: '0', 
     name: this.translate.stream('LANGUAGES.SWEDISH'), 
     i18n: 'sv', 
     flag: { 
     src: './assets/img/sv.svg' 
     } 
    }, 
    { 
     id: '1', 
     name: this.translate.stream('LANGUAGES.ENGLISH'), 
     i18n: 'en', 
     flag: { 
     src: './assets/img/en.svg' 
     } 
    } 
    ]; 

    public currentLanguage: any; 

    private storageSubscription: Subscription; 

    constructor(
    private cs: ClientStorage, 
    private notifications: NotificationsApi, 
    private router: Router, 
    private translate: TranslateService 
) {} 

    ngOnInit() { 

    const storedLanguage: any = this.cs.getItem(AppConstants.currentLanguage); 

    this.currentLanguage = FindObjectByQuery(this.languages, 'i18n', storedLanguage); 

    // Listen for when the language changes from other places than this component 
    this.storageSubscription = this.cs.logger$ 
     .filter(data => data && data.key === AppConstants.currentLanguage) 
     .subscribe((currentLanguage: any) => { 

     if (currentLanguage) { 

      this.currentLanguage = FindObjectByQuery(this.languages, 'i18n', currentLanguage.value); 

      // Set the current language to use 
      this.translate.use(this.currentLanguage.i18n); 
     } 
     } 
    ); 
    } 

    ngOnDestroy() { 
    this.storageSubscription.unsubscribe(); 
    } 

    selectLanguage(language: any): void { 

    this.cs.setItem(AppConstants.currentLanguage, language.i18n); 

    this.router.navigate(['dashboard']); 

    this.notifications.newNotification({message: this.translate.instant('NOTIFICATIONS.LANGUAGES.CHANGED'), theme: 'success'}); 
    } 
} 

Et ce sont mes tests jusqu'à présent:

describe('[UNIT] LanguagesComponent',() => { 

    let component: LanguagesComponent; 
    let fixture: ComponentFixture<LanguagesComponent>; 
    let translate: Location; 

    beforeEach(() => { 

    TestBed.configureTestingModule({ 
     imports: [ 
     ModuleImports 
     ], 
     providers: [ 
     TranslateService 
     ], 
     schemas: [NO_ERRORS_SCHEMA], 
     declarations: [LanguagesComponent, DummyComponent] 
    }); 

    fixture = TestBed.createComponent(LanguagesComponent); 
    component = fixture.componentInstance; 
    translate = TestBed.get(TranslateService); 

    // Make sure ngOnInit runs 
    fixture.detectChanges(); 
    }); 

    it('should create the component', async(() => { 
    expect(component).toBeTruthy(); 
    })); 

    it('should have a current language when the component has loaded',() => { 
    expect(component.currentLanguage).toBeTruthy(); 
    }); 

    it('should have the needed properties in the current language',() => { 

    const currentLanguage = component.currentLanguage; 

    expect(currentLanguage.id).toBeTruthy(); 
    expect(currentLanguage.name).toBeTruthy(); 
    expect(currentLanguage.i18n).toBeTruthy(); 
    expect(currentLanguage.flag.src).toBeTruthy(); 
    }); 

    it('should call the use method of TranslateService with the current language i18n property',() => { 

    const spy = spyOn(translate, 'use').and.callThrough(); 

    expect(spy).toHaveBeenCalledWith(component.currentLanguage.i18n); 
    }); 
}); 

Répondre

1

dans votre test vous avez créé un espion et vous essayez immidietly de vérifier l'appel. Il n'y a pas d'appel.

Il peut y avoir deux solutions possibles pour cela. 1) déplacez votre spyOn avant que fixture.detect ne change avant 0Et 2) Après avoir créé un espion, appelez/déclenchez la méthode appropriée qui déclenchera/devrait déclencher l'appel attendu. Dans ce cas, fixture.detectChanges doit être appelé.

Remarque - Je n'ai pas exécuté vos tests pour d'autres problèmes, mais le problème de base est l'appel manquant entre la création d'un espion et l'utilisation d'un espion.

+0

Merci! J'ai déplacé mon 'fixture.detectChanges()' APRÈS ma déclaration d'espion à l'intérieur de mon bloc synchrone 'beforeEach()' et il fonctionne maintenant comme prévu. –