2017-05-30 31 views
5

ja zdefiniował FooService następującoKorzystanie TypeMoq Mock z Kątowymi pilotowej

import {Injectable} from "@angular/core"; 
export interface Foo { 
    Foo(): string; 
} 

@Injectable() 
export class FooService implements Foo { 
    Foo(): string { 
     return "Fooey!"; 
    } 
} 

i BarComponent jak ten

import {Component} from "@angular/core"; 
import {FooService} from "./foo.service"; 

@Component({ 
    moduleId: 'module.id', 
    template: '<h1>Bar Component</h1>' 
}) 
export class BarComponent { 
    constructor(private fooService: FooService) {} 

    doFoo(): string { 
     return(this.fooService.Foo()); 
    } 
} 

Teraz chcę przetestować BarComponent i chciałbym użyć TypeMoq do mock FooService, więc zrobiłem następujący

import * as TypeMoq from 'typemoq'; 
import {Foo, FooService} from "./foo.service"; 
import {TestBed, async} from "@angular/core/testing"; 
import {BarComponent} from "./bar.component"; 

describe('BarComponent',() => { 
    let component: BarComponent; 
    let mockFooService: TypeMoq.IMock<Foo>; 

    beforeEach(async(() => { 
     mockFooService = TypeMoq.Mock.ofType<Foo>(); 
     TestBed.configureTestingModule({ 
      declarations: [BarComponent], 
      providers: [{ provide: FooService, useValue: mockFooService.object}] 
     }); 
    })); 

    beforeEach(() => { 
     let fixture = TestBed.createComponent(BarComponent); 
     component = fixture.componentInstance; 
    }); 

    it('does something',() => { 
     mockFooService.setup(x => x.Foo()).returns(() => "FooBar!"); 
     expect(component.doFoo()).toEqual("FooBar!"); 
    }); 

}); 

Jednak działa powyższa daje następujący błąd

SyntaxError: Function arg string contains parenthesis 
     at new Function (<anonymous>) 
     at evalExpression (webpack:///~/@angular/compiler/@angular/compiler.es5.js:25431:25 <- config/karma-test-shim.js:59412:40) 
     at jitStatements (webpack:///~/@angular/compiler/@angular/compiler.es5.js:25448:0 <- config/karma-test-shim.js:59429:12) 
     at JitCompiler._compileModule (webpack:///~/@angular/compiler/@angular/compiler.es5.js:25658:0 <- config/karma-test-shim.js:59639:35) 
     at createResult (webpack:///~/@angular/compiler/@angular/compiler.es5.js:25613:0 <- config/karma-test-shim.js:59594:106) 
     at JitCompiler._compileModuleAndAllComponents (webpack:///~/@angular/compiler/@angular/compiler.es5.js:25616:0 <- config/karma-test-shim.js:59597:40) 
     at JitCompiler.compileModuleAndAllComponentsSync (webpack:///~/@angular/compiler/@angular/compiler.es5.js:25559:0 <- config/karma-test-shim.js:59540:23) 
     at TestingCompilerImpl.compileModuleAndAllComponentsSync (webpack:///~/@angular/compiler/@angular/compiler/testing.es5.js:475:0 <- config/karma-test-shim.js:68201:31) 
     at TestBed._initIfNeeded (webpack:///~/@angular/core/@angular/core/testing.es5.js:705:0 <- config/karma-test-shim.js:21376:36) 
     at TestBed.createComponent (webpack:///~/@angular/core/@angular/core/testing.es5.js:791:0 <- config/karma-test-shim.js:21462:14) 
     at Function.TestBed.createComponent (webpack:///~/@angular/core/@angular/core/testing.es5.js:610:0 <- config/karma-test-shim.js:21281:29) 
     at Object.<anonymous> (webpack:///src/app/auth/login/bar.component.spec.ts:19:30 <- config/karma-test-shim.js:99954:41) 
     at ZoneDelegate.invoke (webpack:///~/zone.js/dist/zone.js:365:0 <- config/karma-test-shim.js:65763:26) 
     at ProxyZoneSpec.onInvoke (webpack:///~/zone.js/dist/proxy.js:79:0 <- config/karma-test-shim.js:65294:39) 
     at ZoneDelegate.invoke (webpack:///~/zone.js/dist/zone.js:364:0 <- config/karma-test-shim.js:65762:32) 
     at Zone.run (webpack:///~/zone.js/dist/zone.js:125:0 <- config/karma-test-shim.js:65523:43) 
     at Object.<anonymous> (webpack:///~/zone.js/dist/jasmine-patch.js:104:0 <- config/karma-test-shim.js:65010:34) 
     at webpack:///~/@angular/core/@angular/core/testing.es5.js:96:0 <- config/karma-test-shim.js:20767:17 
     at ZoneDelegate.invoke (webpack:///~/zone.js/dist/zone.js:365:0 <- config/karma-test-shim.js:65763:26) 
     at AsyncTestZoneSpec.onInvoke (webpack:///~/zone.js/dist/async-test.js:49:0 <- config/karma-test-shim.js:64605:39) 
     at ProxyZoneSpec.onInvoke (webpack:///~/zone.js/dist/proxy.js:76:0 <- config/karma-test-shim.js:65291:39) 
     at ZoneDelegate.invoke (webpack:///~/zone.js/dist/zone.js:364:0 <- config/karma-test-shim.js:65762:32) 
     at Zone.run (webpack:///~/zone.js/dist/zone.js:125:0 <- config/karma-test-shim.js:65523:43) 
     at AsyncTestZoneSpec._finishCallback (webpack:///~/@angular/core/@angular/core/testing.es5.js:91:0 <- config/karma-test-shim.js:20762:25) 
     at webpack:///~/zone.js/dist/async-test.js:38:0 <- config/karma-test-shim.js:64594:31 
     at ZoneDelegate.invokeTask (webpack:///~/zone.js/dist/zone.js:398:0 <- config/karma-test-shim.js:65796:31) 
     at Zone.runTask (webpack:///~/zone.js/dist/zone.js:165:0 <- config/karma-test-shim.js:65563:47) 
     at ZoneTask.invoke (webpack:///~/zone.js/dist/zone.js:460:0 <- config/karma-test-shim.js:65858:38) 
     at timer (webpack:///~/zone.js/dist/zone.js:1732:0 <- config/karma-test-shim.js:67130:29) 

Czy jest możliwe aby użyć TypeMoq „s z kątowym TestBed a jeśli tak, w jaki sposób to zrobić poprawnie?

Odpowiedz

2

Ja też się na to natknąłem, przychodzi z powodu tego, jak robisz swoich dostawców.

Zmiana

dostawców: [{stanowią: FooService, useValue: mockFooService.object}]

do

dostawców: [{stanowią: FooService, useFactory() => {powrotu mockFooService .object}}]

Używanie funkcji fabrycznej do zwrotu pozbyłem się dla mnie błędów. Jeśli użyjesz useClass, dostaniesz błąd o param.map nie jest funkcją, a jeśli użyjesz useValue, otrzymasz błąd dotyczący nieoczekiwanego nawiasu. useFactory i tylko wbudowana funkcja, która zwraca moq.object działa.

+0

ta wpadła mi w oko. Dlaczego dokładnie otrzymujemy błąd podczas korzystania z konfiguracji dostawcy 'useValue'? –

+0

Kiedy próbuję to zrobić w ten sposób, widzę błąd "TypeError: Can not convert undefined lub null to object at Function.getPrototypeOf (native)' :-(Mam bardzo podobne ustawienia – Benno

0

Jeśli pan pozwoli mi bezwstydny wtyczkę do my mocking library ... oto jak to będzie wyglądać z ineeda:

import { TestBed, async } from '@angular/core/testing'; 
import { ineeda } from 'ineeda'; 
import { Foo, FooService } from './foo.service'; 
import { BarComponent } from './bar.component'; 

describe('BarComponent',() => { 
    let component: BarComponent; 
     TestBed.configureTestingModule({ 
      declarations: [BarComponent], 
      providers: [{ provide: FooService, useClass: ineeda.factory<FooService>() }] 
     }); 
    })); 

    beforeEach(() => { 
     let fixture = TestBed.createComponent(BarComponent); 
     component = fixture.componentInstance; 
    }); 

    it('does something',() => { 
     let fooService = TestBed.get(FooService); 
     fooService.intercept({ Foo:() => 'FooBar!'); 

     expect(component.doFoo()).toEqual("FooBar!"); 
    }); 

});