2017-07-14 8 views
1

私は、サブジェクトプロパティとそのサブジェクトの.next()を呼び出すメソッドを持つ角度サービスのテストを作成しようとしています。サービスは以下の通りです:ユニットテスト角度2のサービスサブジェクト

@Injectable() 
export class SubjectService { 
    serviceSubjectProperty$: Subject<any> = new Subject(); 

    callNextOnSubject(data: any) { 
    this.serviceSubjectProperty$.next(data); 
    } 
} 

そして、そのサービスのテストファイル:

import { TestBed, inject } from '@angular/core/testing'; 

import { SubjectService } from './subject.service'; 

describe('SubjectService',() => { 

    beforeEach(() => { 
    TestBed.configureTestingModule({ 
     providers: [ 
     SubjectService 
     ] 
    }); 
    }); 

    it('callNextOnSubject() should emit data to serviceSubjectProperty$ Subject', 
    inject([SubjectService], (subjectService) => { 
     subjectService.callNextOnSubject('test'); 

     subjectServiceProperty$.subscribe((message) => { 
     expect(message).toBe('test'); 
     }) 
    })); 
}); 

私は何か他のものへの「試験」からsubjectService.callNextOnSubjectの引数を変更した場合、テストは常にイベントを渡します。私もasyncとfakeAsyncですべてをラップしようとしましたが、結果は同じです。

callNextOnSubjectがserviceSubjectProperty $ Subjectにデータを送信しているかどうかをテストする正しい方法は何ですか?

+1

メソッドを呼び出す前に*サブスクライブする必要があります。そのサブジェクトには、再生/バッファの動作がありません。 – jonrsharpe

+0

@jonrsharpeは働いて、ありがとう。 –

+0

_service_をユニットテストするときは、角度テストインフラストラクチャを使用すべきではありません。テストコードを長くしてエラーを起こしやすいようにするだけです。 –

答えて

0

対象が呼び出された後にコンポーネントで変更されたデータをテストする必要があります。パブリック変数のみをテストする必要があります。例えば :

サービス:

@Injectable() 
export class SomeService { 
    onSomeSubject: Subject<any> = new Subject(); 

    someSubject(string: string) { 
     this.onSomeSubject.next(string); 
    } 
} 

成分:溶液の検索中

... 
describe('SomeService',() => { 
    let someService: SomeService; // import SomeService on top 
    let someComponent: SomeComponent; // import SomeService on top 

    beforeEach(() => { 
     TestBed.configureTestingModule({ 
      providers: [SomeService, SomeComponent] 
     }); 
     injector = getTestBed(); 
     someService = injector.get(SomeService); 
     someComponent = injector.get(SomeComponent); 
    }); 

    describe('someSubject',() => { 
     const string = 'someString'; 

     it('should change string in component',() => { 
      someService.someSubject(string); 
      expect(someComponent.string).tobe(string); 
     }); 
    }); 
}); 
0

私はこの記事を見つけた:試験

export class SomeComponent { 
    @Input() string: string; 

    constructor(private service: SomeService) { 
     service.onSomeSubject.subscribe((string: string) => { 
      this.string = string; 
     }); //don't forget to add unsubscribe. 
    } 
} 

http://www.syntaxsuccess.com/viewarticle/unit-testing-eventemitter-in-angular-2.0

(それは非常に短いです、それを開くことを恐れてはいけません)私にとってはうまくいきました。

私はここに貼り付けていますので、このサイトに来て回答を探している人に役立つかもしれません。

聞かれる質問について

- 私はあなたが変更する必要があると思う:

subjectServiceProperty$.subscribe((message) => { 
    expect(message).toBe('test'); 
    }) 

    subjectService.callNextOnSubject('test'); 

subjectService.callNextOnSubject('test'); 

    subjectServiceProperty$.subscribe((message) => { 
    expect(message).toBe('test'); 
    }) 

、そのイベントを発し、その後、最初に購読を。

サブスクリプションの前に'test'を発行すると、そのイベントを「キャッチ」するものはありません。

関連する問題