2017-10-26 4 views
1

typemoqthis question과 비슷하게 ts-mockito 개의 물체를 각도의 TestBed.configureTestingModule()에 어떻게 주입 할 수 있습니까? 내가 찾을 수있는 모든 example ts-mockito 테스트는 각도와 무관합니다.각도 4 부품 테스트에 ts-mockito를 주입하는 방법

우리가 조롱하고있는 백엔드에 과 함께 ProgressComponent을 포함하는 다음 minmal 작업 예제를 고려해보십시오. 이 서비스는 매우 간단하다 :

import { Injectable } from '@angular/core'; 

@Injectable() 
export class ProgressService { 
    private currentState: string = '1'; 

    constructor() { 
    } 

    setCurrentState(state: string) { 
     this.currentState = state; 
    } 

    getCurrentState(){ 
     return this.currentState 
    } 

} 

ts-mockito없이 조롱하기 위해, 우리는 단순히 클래스를 확장합니다. ProgressComponent을 테스트 할 때

import {ProgressService} from "../../../progress.service"; 

export class MockProgressService extends ProgressService{} 

그리고는 다음의 MockProgressService는 테스트 베드에 전달됩니다.

import {async, ComponentFixture, getTestBed, TestBed} from '@angular/core/testing' 

import { ProgressComponent } from './progress.component' 
import {ProgressService} from "../progress.service" 
import {MockProgressService} from "../shared/services/progress/progress.mock"; 

describe('ProgressComponent',() => { 
    let injector: TestBed 
    let mockService: ProgressService 
    let fixture: ComponentFixture<ProgressComponent> 
    let component: ProgressComponent 

    beforeEach(async() => { 
    TestBed.configureTestingModule({ 
     declarations: [ ProgressComponent ], 
     providers: [{provide: ProgressService, useClass: MockProgressService}] 
    }).compileComponents() 

    injector = getTestBed() 
    fixture = TestBed.createComponent(ProgressComponent) 
    component = fixture.componentInstance 
    mockService = injector.get(ProgressService) 

    fixture.detectChanges(); 
    }); 
}); 

각도 테스트 워크는 TestBed 통해 의존성 주입을 도입한다. 각도 테스트 설정에서 mockito를 어떻게 사용할 수 있습니까? 예를 들어, injector.get(ProgressService) 스 니펫을 ts-mockito 모의와 호환 가능하게 만들 수 있습니까?

+0

'class MockProgressService extends ProgressService'는별로 의미가 없으므로 ts-mockito 객체의 문제점은 무엇인지 명확하지 않습니다. 'useValue : ...'또는'useFactory :() => ... '를 사용하여 원하는 객체로 서비스를 조롱 할 수 있습니다. – estus

+0

각도 튜토리얼은 조롱중인 실제 클래스를 확장하여 모의 객체를 만듭니다. 따라서 MockProgressService는 단지 ProgressService를 확장하고 있습니다 (이 경우 메소드를 덮어 쓰지 않습니다). 그래서 useClass isntead, useValue는 수동으로 인스턴스화 한 mockito 객체에 대한 참조입니까? –

+0

예, 그렇습니다. 나는 그 튜토리얼의 요점은 무엇인지 모르겠다. 그러나 일반적으로 조롱당한 실제 수업을 확장하는 것은 실용적인 이유가 없다. – estus

답변

2

제공자가 클래스가 아닌 다른 객체로 조롱되어야하는 경우 useValue 또는 useFactory을 사용해야합니다.

재스민의 경우는 다음과 같습니다

providers: [{ 
    provide: ProgressService, 
    useValue: jasmine.createSpyObj('ProgressService', [...]) 
}] 

그리고 TS-mockito에 대한

그것은 할 수있다 : 일반적으로 혜택이없는

progressServiceMock = mock(ProgressService); 
... 
providers: [{provide: ProgressService, useValue: instance(progressServiceMock)}] 

동안 상속 조롱 클래스 FRIM 원래 클래스 class MockProgressService extends ProgressService처럼. 일부 메소드를 모방하는 것이 목적이라면 실제 인스턴스 또는 클래스 프로토 타입에 jasmine.spy (또는 현재 테스트 프레임 워크가 가지고있는 것)으로 조롱받을 수 있습니다. 그리고 클래스가 현재 유닛 테스트에서 테스트 된 클래스가 아닌 경우, 여러 메소드가 아닌 모든 메소드를 조롱하거나 스터 빙하면 테스트 분리에 도움이됩니다.

+0

mocks vs spies에 대한이 게시물은 내가 열거 한 두 가지 사례 (https://stackoverflow.com/questions/12827580/mocking-vs-spying-in-mocking-frameworks)의 차이점을 이해하는 데 도움이되었습니다. 감사합니다 –

+0

반갑습니다. 실제 작업에서 후자의 것을 사용하지 마십시오. 재스민 스파이는 매우 다목적이며, 더 복잡한 재료의 경우 모카 스터브가 좋습니다. 나는 mockito와 typemoq가 제공하는 기본 행동에 익숙하지 않다. 이 클래스는 주로 모든 클래스 메서드를 자동으로 스텁 (stub)하기위한 것이지만, 일부 수동 컨트롤로 탐욕스럽게 조롱하면 테스트 코드에서 실수를 쉽게 발견 할 수 있습니다. Typemoq는이 문제를 해결할 수있는 '엄격한'모드를 가지고 있지만, mockito는 그렇게 좋아 보이지 않습니다. – estus