2017-02-10 9 views
20

私のAPI呼び出しはJWTで認証されます。私はサービスメソッドのコードを記述しようとしています。すべての要求は、このインターセプタがあります:角2 JWTユニットテスト

public interceptBefore(request: InterceptedRequest): InterceptedRequest { 
     // Do whatever with request: get info or edit it 
     this.slimLoadingBarService.start(); 
     let currentUser = JSON.parse(localStorage.getItem('currentUser')); 
     if (currentUser && currentUser.data.token) { 
      request.options.headers.append('Authorization', 'Bearer ' + currentUser.data.token); 
     } 
     return request; 
    } 
私がテストしたい

サービス方法:

getAll(page: number, pageSize: number, company: string): Observable<any> { 
     return this.http.get(`${this.conf.apiUrl}/jobs`) 
      .map((response: Response) => response.json()); 
    } 

はそれのためのコードを開始

import { MockBackend, MockConnection } from '@angular/http/testing'; 
import { Http, BaseRequestOptions, Response, ResponseOptions, RequestMethod } from '@angular/http'; 
import { JobListService } from './job-list.service'; 
import { inject, TestBed } from '@angular/core/testing/test_bed'; 
import { JOBLISTMOCK } from '../mocks/job-list.mock'; 

fdescribe('Service: JobListService',() => { 
    beforeEach(() => { 
     TestBed.configureTestingModule({ 
      providers: [ 
       JobListService, 
       MockBackend, 
       BaseRequestOptions, 
       { 
        provide: Http, 
        useFactory: (backend: MockBackend, defaultOptions: BaseRequestOptions) => { 
         return new Http(backend, defaultOptions); 
        }, 
        deps: [MockBackend, BaseRequestOptions] 
       }, 
      ] 
     }); 
    }); 

    it('should create a service', inject([JobListService], (service: JobListService) => { 
     expect(service).toBeTruthy(); 
    })); 

    describe('getAll',() => { 
     it('should return jobs', inject([JobListService, MockBackend], (service: JobListService, backend: MockBackend) => { 
      let response = new ResponseOptions({ 
       body: JSON.stringify(JOBLISTMOCK) 
      }); 

      const baseResponse = new Response(response); 

      backend.connections.subscribe(
       (c: MockConnection) => c.mockRespond(baseResponse) 
      ); 

      return service.getAll(1, 10, '18').subscribe(data => { 
       expect(data).toEqual(JOBLISTMOCK); 
      }); 
     })); 
    }); 
}); 

に対してそれをテストする方法がわかりませんインターセプター。

PS:テストとしては、エラーを取得し、今ある:

1) should create a service 
    JobListService 
    TypeError: null is not an object (evaluating 'this.platform.injector') in src/test.ts (line 83858) 
[email protected]:///~/@angular/core/testing/test_bed.js:254:0 <- src/test.ts:83858:44 

2) should return jobs 
    JobListService getAll 
    TypeError: null is not an object (evaluating 'this.platform.injector') in src/test.ts (line 83858) 
[email protected]:///~/@angular/core/testing/test_bed.js:254:0 <- src/test.ts:83858:44 

答えて

7

TypeError: null is not an object (evaluating 'this.platform.injector')

あなたは正しくテスト環境を初期化していない場合、一般的にこのエラーが表示されます。あなたはそれだけで全体のテストスイートを実行するために一度呼び出されるべきであるということである、以下の

import { 
    BrowserDynamicTestingModule, platformBrowserDynamicTesting 
} from '@angular/platform-browser-dynamic/testing'; 
... 
beforeAll(() => { 
    TestBed.initTestEnvironment(
    BrowserDynamicTestingModule, 
    platformBrowserDynamicTesting() 
); 
}); 

このかかわらについての事をすることによってこの問題を解決することができます。あなたはすべてのテストファイルでそれを持っているのであれば、その後、各ファイル

beforeAll(() => { 
    TestBed.resetTestEnvironment(); 
    TestBed.initTestEnvironment(
    BrowserDynamicTestingModule, 
    platformBrowserDynamicTesting() 
); 
}); 

このかかわらず、より良いで最初にそれをリセットする必要があり、それぞれのテストファイルにそれを追加しないことです。 testing sectionに、Webpack統合用のAngularドキュメントを見ると、ファイルkarma-test-shim.jsが表示されます。このファイルには、我々は上記と同じ初期化呼び出しを行う下部に見ることができるテスト環境

Error.stackTraceLimit = Infinity; 

require('core-js/es6'); 
require('core-js/es7/reflect'); 

require('zone.js/dist/zone'); 
require('zone.js/dist/long-stack-trace-zone'); 
require('zone.js/dist/proxy'); 
require('zone.js/dist/sync-test'); 
require('zone.js/dist/jasmine-patch'); 
require('zone.js/dist/async-test'); 
require('zone.js/dist/fake-async-test'); 

var appContext = require.context('../src', true, /\.spec\.ts/); 

appContext.keys().forEach(appContext); 

var testing = require('@angular/core/testing'); 
var browser = require('@angular/platform-browser-dynamic/testing'); 

testing.TestBed.initTestEnvironment(browser.BrowserDynamicTestingModule, 
    browser.platformBrowserDynamicTesting()); 

を初期化するための推奨方法です。このファイルをコンフィグレーション内のfiles配列のkarma.conf.jsファイルに追加する必要があります。これは上記のリンクされたドキュメントのものです

files: [ 
    {pattern: './config/karma-test-shim.js', watched: false} 
], 

preprocessors: { 
    './config/karma-test-shim.js': ['webpack', 'sourcemap'] 
}, 
関連する問題