2017-08-02 29 views
0

我想爲我的DataService類創建一個測試腳本。我知道我需要將服務注入類,但DataService構造函數需要Apollo注入。我發現一些過時的解決方案無效。任何幫助將不勝感激!當我的服務在其構造函數中有一個注入點時,如何注入一個服務到我的測試中?

@Injectable() 
export class DataService { 

    constructor(private apollo: Apollo) {} 

    ... 

} 

這就是我需要的DataService的測試:

const chai = require('chai'); 
const should = chai.should(); 
const req = require("request-promise"); 
import {inject} from "@angular/core/testing"; 
import { DataService } from '../data.service' 

describe('User',() => { 


    beforeEach(() => { 

    }) 

    it('Can be created.', (done) => { 

    }); 
}) 

回答

0

您將要創建一個具有提供商,這是基本的規則的列表,Angular2遵循什麼一個TestModule當有要求時注入。

beforeEach(() => { 

    TestBed.configureTestingModule({ 
    providers: [Apollo] // This will return an instance of the actual Apollo class (you will need to import Apollo in your spec file) 
    }).compileComponents(); 

}); 

這將允許您在正在測試的代碼中注入Apollo服務。但是,您可能不希望注入的實際阿波羅服務,在這種情況下,你可以創建一個模擬阿波羅類,並告訴測試組件注入到位阿波羅

class MyMockApollo {...} // should mock up any methods that your tests will rely on 

beforeEach(() => { 

    TestBed.configureTestingModule({ 
    providers: [ 
     {provide: Apollo, useClass: MyMockApollo} // This will return an instance of MyMockApollo 
    ] 
    }).compileComponents(); 

}); 

第三種選擇是,假冒類提供而非

providers: [ 
     {provide: Apollo, useValue: mockApolloInstance} // This will return the exact thing you give it 
    ] 
+0

感謝傑森,我只是嘗試這樣做,我得到一個錯誤:「VAR FakeAsyncTestZoneSpec =防區[ 'FakeAsyncTestZoneSpec']; ^ 的ReferenceError:區是未定義「 – Medivh

+0

我發現摩卡/柴和角度不相處得很好。我正在切換到Karma/Jasmine,這是推薦的工具。謝謝您的幫助 – Medivh

相關問題