2016-10-29 15 views
11

के दौरान कोणीय 2 में नकली कस्टम सेवा मैं अपनी सेवा में उपयोग किए गए घटक के लिए एक इकाई परीक्षण लिखने की कोशिश कर रहा हूं। घटक और सेवा ठीक काम करते हैं।इकाई परीक्षण

घटक:

import {Component} from '@angular/core'; 
import {PonyService} from '../../services'; 
import {Pony} from "../../models/pony.model"; 
@Component({ 
    selector: 'el-ponies', 
    templateUrl: 'ponies.component.html', 
    providers: [PonyService] 
}) 
export class PoniesComponent { 
    ponies: Array<Pony>; 
    constructor(private ponyService: PonyService) { 
    this.ponies = this.ponyService.getPonies(2); 
    } 
    refreshPonies() { 
    this.ponies = this.ponyService.getPonies(3); 
    } 
} 

सेवा:

import {Injectable} from "@angular/core"; 
import {Http} from "@angular/http"; 
import {Pony} from "../../models/pony.model"; 
@Injectable() 
export class PonyService { 
    constructor(private http: Http) {} 
    getPonies(count: number): Array<Pony> { 
    let toReturn: Array<Pony> = []; 
    this.http.get('http://localhost:8080/js-backend/ponies') 
    .subscribe(response => { 
     response.json().forEach((tmp: Pony)=> { toReturn.push(tmp); }); 
     if (count && count % 2 === 0) { toReturn.splice(0, count); } 
     else { toReturn.splice(count); } 
    }); 
    return toReturn; 
    }} 

घटक इकाई परीक्षण:

import {TestBed} from "@angular/core/testing"; 
import {PoniesComponent} from "./ponies.component"; 
import {PonyComponent} from "../pony/pony.component"; 
import {PonyService} from "../../services"; 
import {Pony} from "../../models/pony.model"; 
describe('Ponies component test',() => { 
    let poniesComponent: PoniesComponent; 
    beforeEach(() => { 
    TestBed.configureTestingModule({ 
     declarations: [PoniesComponent, PonyComponent], 
     providers: [{provide: PonyService, useClass: MockPonyService}] 
    }); 
    poniesComponent = TestBed.createComponent(PoniesComponent).componentInstance; 
    }); 
    it('should instantiate component',() => { 
    expect(poniesComponent instanceof PoniesComponent).toBe(true, 'should create PoniesComponent'); 
    }); 
}); 

class MockPonyService { 
    getPonies(count: number): Array<Pony> { 
    let toReturn: Array<Pony> = []; 
    if (count === 2) { 
     toReturn.push(new Pony('Rainbow Dash', 'green')); 
     toReturn.push(new Pony('Pinkie Pie', 'orange')); 
    } 
    if (count === 3) { 
     toReturn.push(new Pony('Fluttershy', 'blue')); 
     toReturn.push(new Pony('Rarity', 'purple')); 
     toReturn.push(new Pony('Applejack', 'yellow')); 
    } 
    return toReturn; 
    }; 
} 

package.json का हिस्सा:

{ 
    ... 
    "dependencies": { 
    "@angular/core": "2.0.0", 
    "@angular/http": "2.0.0", 
    ... 
    }, 
    "devDependencies": { 
    "jasmine-core": "2.4.1", 
    "karma": "1.2.0", 
    "karma-jasmine": "1.0.2", 
    "karma-phantomjs-launcher": "1.0.2", 
    "phantomjs-prebuilt": "2.1.7", 
    ... 
    } 
} 
:

जब मैं निष्पादित 'कर्म स्टार्ट' मैं यह त्रुटि

Error: Error in ./PoniesComponent class PoniesComponent_Host - inline template:0:0 caused by: No provider for Http! in config/karma-test-shim.js

यह कर्म की तरह लग रहा बजाय PonyService का उपयोग करता MockPonyService के रूप में यह मजाक, इस लाइन के बावजूद की मिलता है।

प्रश्न: मुझे सेवा का नकल कैसे करना चाहिए?

उत्तर

15

यह इस

@Component({ 
    providers: [PonyService] <====== 
}) 

यह बात करता है तो यह है कि सेवा घटक, जिसका अर्थ है कि कोणीय प्रत्येक घटक के लिए यह पैदा करेगा, और यह भी के दायरे वाला की वजह से है कि यह किसी भी वैश्विक पर कॉन्फ़िगर प्रदाताओं अधिरेखित का मतलब मॉड्यूल स्तर। इसमें नकली प्रदाता शामिल है जिसे आप परीक्षण बिस्तर में कॉन्फ़िगर करते हैं।

इसके आसपास पाने के लिए, कोणीय TestBed.overrideComponent विधि प्रदान करता है, जो हमें @Component.providers और @Component.template जैसी चीज़ों को ओवरराइड करने की अनुमति देता है।

TestBed.configureTestingModule({ 
    declarations: [PoniesComponent, PonyComponent] 
}) 
.overrideComponent(PoniesComponent, { 
    set: { 
    providers: [ 
     {provide: PonyService, useClass: MockPonyService} 
    ] 
    } 
}); 
+0

+1। लेकिन चूंकि सेवा पूरी तरह से स्टेटलेस है, इसलिए यह एक सिंगलटन होना चाहिए और घटक प्रदाताओं की बजाय मॉड्यूल प्रदाताओं में घोषित किया जाना चाहिए। –

संबंधित मुद्दे