2017-04-25 15 views
0

他のサービスとのサービスを依存関係としてテストするための正しいソリューションを見つけることができません。私がテストしているサービスは、タスクのリストを返す別のサービスでgetterメソッドを呼び出します。サービス依存関係のあるサービスのテスト

サービステスト:

export class TasksData { 
    public tasks = []; 
    public tasksData = [ 
    { 
     'form': 'setup-device', 
     'type': 'register-device', 
     'text': 'Register Device', 
     'icon': 'mdi-cellphone-link', 
     'status': '' 
    }, 
    { 
     'form': 'setup-eula', 
     'type': 'confirm-eula', 
     'text': 'Agree to EULA', 
     'icon': 'mdi-pen', 
     'status': '' 
    }, 
    { 
     'form': 'setup-change-password', 
     'type': 'change-password', 
     'text': 'Change Password', 
     'icon': 'mdi-lock-reset', 
     'status': '' 
    }, 
    { 
     'form': 'setup-profile', 
     'type': 'register-profile', 
     'text': 'Register Profile', 
     'icon': 'mdi-account-plus', 
     'status': '' 
    } 
    ]; 

    constructor(private setupManager: SetupManagerService) {} 

    public getter() { 
    let data = []; 
    this.tasks = this.setupManager.getter(); 

    data = this.tasksData.filter((task) => { 
     return (this.tasks.indexOf(task.type)) !== -1; 
    }); 

    return data; 
    } 
} 

依存関係サービス:

export class SetupManagerService { 
    private message: string; 
    private redirect = ''; 
    private tasks: any = []; 
    private clone: any = []; 
    private user: Object = {}; 

    public taskChange = new Subject(); 

    constructor(
    private closeModal: CloseModalService, 
    private pubsub: Pubsub, 
    private reloadStatus: ReloadStatusService, 
    private router: Router, 
    private storage: HTML5Storage 
) {} 

    // ===== Removed code for brevity ===== // 

    public getter() { 
    return this.clone; 
    } 
} 

テスト:これは私がテストしていたサービスです

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

// Test Case: 
import { TasksData } from '../tasks-data.service'; 

// Dependencies: 
import { SetupManagerService } from '../setup-manager.service'; 

let ds = [{ 
    'form': 'setup-device', 
    'type': 'register-device', 
    'text': 'Register Device', 
    'icon': 'mdi-cellphone-link', 
    'status': '' 
}]; 

class SetupManagerServiceStub { 
    getter() { 
    return ['register-device']; 
    } 
} 

fdescribe('Service TaskData',() => { 
    let subject = TasksData; 
    let setupManager; 

    beforeEach(() => { 
    TestBed.configureTestingModule({ 
     providers: [ 
     TasksData, 
     { provide: SetupManagerService, useClass: SetupManagerServiceStub } 
     ] 
    }); 

    subject = TestBed.get(TasksData); 
    setupManager = TestBed.get(SetupManagerService); 
    }); 

    it('should create an instance',() => { 
    expect(subject).toBeDefined(); 
    }); 

    it('should... ',() => { 
    expect(subject.getter()).toEqual(ds); 
    }); 
}); 
私はこのオンラインを行う方法のさまざまな例を試してみましたが、それらが原因最終リリースに先立って角度の変化にもはや有効であるため、それらのほとんどはおそらく、動作しません。

TasksDataサービスには、依存関係としてSetupManagerServiceがあります。ですから、すべてのSetupManagerServiceの依存関係を追加する必要を避けるために、getterメソッドでスタブクラスを作成し、TaskDataサービスをテストするのに必要な期待値に戻しました。これもこれを行うには正しい方法であれば、すべての

まず私はわかりません。 Angular's Test Docsには、TestBed Moduleを使用してサービス依存関係のあるサービスをテストする方法の例はありません。これは、一日の試した結果、私の最高の仕事の結果です。

これが正しいかどうかについて私の質問は私の問題の一部です。もう一つの問題はTypescriptが私のしたことに不満を持ち、私はこれを解決する方法を見つけていないということです。

enter image description here

そして、私のエディタでこの醜い赤い下線警告:

enter image description here

+2

かなり面白いコメントでなければなりません。私は、ほとんどの開発者がドキュメントを読んでフレームワークを使う方法を学ぶことはかなり確信しています。上で述べたように、TestBedを使ってサービス依存関係のあるサービスをテストすることはできませんでした。これは学習する場所であると考えられているので、あなたはおそらくそれを避けるために建設的な何かを持っていない場合。 – Aaron

答えて

1

これは単に活字体の問題であり、テストに

にもかかわらず、私は次のエラーを取得する渡します具体的には、次の行:

let subject = TasksData; 

subjectTasksDataのインスタンスであるはずです)をコンストラクタに割り当てることができる理由はありません。 subjectを何らかの理由で再割り当てしないと、undefinedにはなりませんが、まだインスタンスにはなりません。これにより、デバッグが難しいテストが発生します。ここでsubject

が暗黙的に割り当てられた値が入力され、それは、明らかに間違っているかを示し、そのタイプのエラーになり

subject = new TasksData(); 

でそれを再割り当て

let subject: typeof TasksData = TasksData; 

と同じである

Type 'TasksData' is not assignable to type 'typeof TasksData'.

TestBed.get isn't type safe and returns any以降、タイプエラーが発生しません。 subject.getterがアクセスされたときにだけタイプが混乱していることが明らかになる。

それは

let subject: TasksData; 
+0

ありがとうございます。それは確かにそれを固定した。私はそれを感謝します。 – Aaron

+0

あなたは大歓迎です。 – estus