2017-10-06 10 views
0

我在我的應用程序,像這樣有一個簡單的服務...測試一個簡單的服務使用。接下來,在角4 .subscribe使用噶/茉莉花

import {Injectable} from '@angular/core'; 
import {Observable} from 'rxjs/Observable'; 
import {Subject} from 'rxjs/Subject'; 

@Injectable() 
export class WizardDialogNavigationService { 

    public navAction$: Observable<any>; 
    private navActionSubject: Subject<any> = new Subject(); 

    constructor() { 
    this.navAction$ = this.navActionSubject.asObservable(); 
    } 

    public navAction(action: string): void { 
    this.navActionSubject.next(action); 
    } 
} 

這不是最複雜的服務,它只是允許我在組件之間進行通信。現在我需要測試它,我不得不承認我對測試知之甚少。我只是想檢查,當WizardDialogNavigationService.navAction被稱爲navAction$可觀察包含傳遞的字符串,所以我寫了下面......

import {TestBed, inject, async} from '@angular/core/testing'; 
import {Observable} from 'rxjs/Rx'; 
import {expect} from 'chai'; 
import * as sinon from 'sinon'; 
import {WizardDialogNavigationService} from './wizard-dialog-navigation.service'; 

describe('WizardDialogNavigationService',() => { 
    beforeEach(() => { 
    TestBed.configureTestingModule({ 
     providers: [WizardDialogNavigationService] 
    }); 
    }) 

    describe('navAction$ Observable',() => { 

    let sut: WizardDialogNavigationService; // sut = Service Under Test 

    beforeEach(inject([WizardDialogNavigationService], (service: WizardDialogNavigationService) => { 
     sut = service; 
    })); 

    it('should be the last passed value', async(() => { 
     const resultList = []; 
     sut.navAction('TestString'); 

     sut.navAction$.subscribe((result) => resultList.push(result)); 
     console.log(resultList); // output is [] 
     expect(resultList.indexOf('TestString')).to.equal(0); 
    })); 
    }); 
}); 

我想我要對這個錯誤的resultList陣列不包含通過價值?就好像.next() .subscribe()沒有被調用/運行。如果有人能告訴我,我錯了我將不勝感激。

+0

的'Observable'將不執行'subscribe'with的最後一個值,因爲它是熱的。您是否嘗試訂閱「主題」本身? – Dinistro

+0

我也嘗試太通過使'navActionSubject'public然後訂閱,在測試'sut.navActionSubject.subscribe((結果)=>執行console.log(結果));'這有沒有輸出要麼... –

回答

1

你需要一個BehaviorSubject這將返回已存儲的值,如果你直接給它subscribe

因此,您可以將Subject更改爲BehaviorSubject並訂閱它,它將起作用。

文件:

https://github.com/ReactiveX/rxjs/blob/master/doc/subject.md#behaviorsubject

+0

你的意思是在我的組件代碼,這樣的'公共navActionSubject:BehaviorSubject =新BehaviorSubject(NULL);' –

+0

@馬克睡魔excactly – Dinistro

+0

輝煌 - 偉大的答案 - 謝謝! –