2017-02-10 144 views
20

我的API調用通過JWT進行身份驗證。我正在嘗試編寫一個服務方法的代碼。所有請求有這個攔截器:Angular 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() 
); 
}); 

比這更好的,雖然第一次復位,是不是在每個測試文件添加它。如果您查看Webpack集成的Angular文檔,在testing section中,您將看到一個文件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'] 
},