2016-11-14 5 views
2

私はテストの世界で初めてで、既存のアンギュラ2コードの単体テストを書き始めました。私はconfirmDeleteの機能を持っており、Obserable<boolean>を返し、PrimeNGの内部でConfirmationServiceを使用して、ポップアップでユーザーからのフィードバックを得る。機能のユニットテスト角度オブザーバブル

定義は以下のとおりである:

confirmDelete(): Observable<boolean> { 
    let confirmObservable = Observable.create((observer: Observer<boolean>) => {    
     this.confirmationService.confirm({ 
      header: 'Delete Confirmation', 
      message: 'Do you really want to delete this record?', 
      accept:() => { 
       observer.next(true); 
       observer.complete();    
      }, 
      reject:() => { 
       observer.next(false); 
       observer.complete(); 
      } 
     }); 

    }); 

    return confirmObservable; 

} 

私は、コードのこの部分のためのユニットテストを書きたいです。私はConfirmationServiceのためのスタブを書くつもりだったが、私はユニットテストの世界には新しいので、セットアップが難しいと思っている。

私の質問は、この特定のシナリオで単体テストを書く正しいアプローチは何ですか。

EDIT: -

私は@peeskilletによって提案された解決策を試してみましたが、その後、私はConfirmationServiceMockConfirmationService間の型の不一致エラーを取得し始めました。

以下は、PrimeNGライブラリにあるConfirmationServiceおよびConfirmationクラスの宣言です。

export interface Confirmation { 
    message: string; 
    icon?: string; 
    header?: string; 
    accept?: Function; 
    reject?: Function; 
    acceptVisible?: boolean; 
    rejectVisible?: boolean; 
    acceptEvent?: EventEmitter<any>; 
    rejectEvent?: EventEmitter<any>; 
} 
export declare class ConfirmationService { 
    private requireConfirmationSource; 
    private acceptConfirmationSource; 
    requireConfirmation$: Observable<Confirmation>; 
    accept: Observable<Confirmation>; 
    confirm(confirmation: Confirmation): this; 
    onAccept(): void; 
} 

答えて

3

私はおそらくacceptreject機能の参照に上モック保留になるだろう。テストでは、ブール値が正しいことを確認するためにテストを呼び出すことができます。あなたのテストで続いて

class MockConfirmationService { 
    accept: Function; 
    reject: Function; 

    confirm(config: any) { 
    this.accept = config.accept; 
    this.reject = config.reject; 
    } 
} 

のような何かがちょうどaccepttrueが放出されることをテストするために呼び出す、とfalseが放出されることをテストするrejectを呼び出します。

describe('serivce: ModalService',() => { 

    let modalService: ModalService; 
    let confirmService: MockConfirmationService; 

    beforeEach(() => { 
    confirmService = new MockConfirmationService(); 
    TestBed.configureTestingModule({ 
     providers: [ 
     ModalService, 
     { provide: ConfirmationService, useValue: confirmService } 
     ] 
    }); 

    modalService = TestBed.get(ModalService); 
    }); 

    it('should return true when accepted', async(() => { 
    modalService.confirmDelete().subscribe(result => { 
     expect(result).toBe(true); 
     console.log('accepted test complete'); 
    }); 
    confirmService.accept(); 
    })); 

    it('should return false when rejected', async(() => { 
    modalService.confirmDelete().subscribe(result => { 
     expect(result).toBe(false); 
     console.log('rejected test complete'); 
    }); 
    confirmService.reject(); 
    })); 
}); 
+0

ありがとう@ peeskillet。私は上記の解決策を試みたが、いくつかのタイプの不一致エラーが発生している。上記の編集済みの記事をご覧ください。 –

+0

私はうまくいくはずです。私はそれをテストし、それは正常に動作します。私の例を正確に見てください。 'ModalService'はコンストラクタパラメータとして' ConfirmationService'をとる単純なクラスだけです。そして、メソッド、私はあなたの投稿からstrightをコピーして貼り付けました –

+0

TestBedを使わずにテストをしようとしている場合(テスト対象のサービスをインスタンス化し、モックをそのコンストラクタに渡す)、そのキャストする必要がありますそれを渡そうとする前に嘲笑してください。しかし、テストベッドを使用すると、型チェックはコンパイル時だけであるので、これらのことを心配する必要はありません –

0

私はpeeskilletの答えから構築しました。 P-confirmDialogコンポーネントは、サービス加入呼び出すので、私は私はPrimeNg源において見出さrequireConfirmationSourceを添加しなければなりませんでした。私の模擬は次の通りです:

// 
import { Subject } from 'rxjs/Subject'; 
import { Observable } from 'rxjs/Observable'; 
// 
export class ConfirmationServiceMock { 
    public key: string = 'mock1'; 
    public header: string = 'Delete Confirmation'; 
    public icon: string = ''; 
    public message: string = ''; 
    // Call Accept to emulate a user accepting 
    public accept: Function; 
    // Call Reject to emulate a user rejecting 
    public reject: Function; 
    private requireConfirmationSource = new Subject<any>(); 
    requireConfirmation$ = this.requireConfirmationSource.asObservable(); 
    // 
    public confirm(config: any) { 
     console.log('In confirm service mock...'); 
     this.message = config.message; 
     this.accept = config.accept; 
     this.reject = config.reject; 
     console.log(this.message); 
     return this; 
    } 
} 
// 
関連する問題