2017-01-23 3 views
1

나는 앵글 2 서비스에서 테스트하고 싶은 기능이 있습니다.각도 2 테스트에서 모듈 위조

service.ts

upload(){ 
    let file = new Transfer(); 
    file.upload(myfile).then(// my callback); 
} 

나는 jasmine를 사용하여 내 시험에서 Transfer을 조롱하고 싶습니다. 나는

sevice.spec.ts

import { TransferMock as Transfer } from '../mocks/mocks' 그것을 조롱하는 내에서 이것을 시도했다. 하지만 작동하지 않습니다. 이것은 내 테스트가 인스턴스화되는 방법입니다.

describe('authentication service' ,() => { 
    beforeEach(() => { 
    auth = new Service(<any>new HttpMock(), <any>new StorageMock()) 
    }); 
    it('initialize authentication',() => { 
    expect(auth).not.toEqual(null); 
    auth.upload('file'); //it fails here 
    }); 
}) 

편집

Transfer는 서비스에 주입되지 않습니다. 하나의 기능 만 Transfer을 사용합니다. 따라서 주입하지 않으면 앱의 초기 로딩 시간을 줄일 수 있습니다 (다른 의견을 알게되어 행복 할 것입니다). 그래서 나는이 방법으로 그것의 구조가 있다면 어쨌든 모의가 있는지 알고 싶다?

편집이 가장 좋은 방법이기 때문에 나는 마틴의 답변을 받아했지만

, 그것은 당신이 실패 할 수 있습니다 브라우저 지원이 나던 플러그인 plugins.If ionic-native를 사용할 때 발생할 수있는 하나의 문제가있다. 이 경우에는 주입했을 때 오류 FileTransfer is not defined이 발생했습니다. 그래서 나는 다시 돌아와서 제안을 찾는다.

답변

4

테스트에서 클래스에 모의 객체를 제공하려면 구현에 클래스를 삽입해야합니다.

귀하의 ngModule에 귀하의 제공 업체로 이전을 추가하십시오. 그런 다음 간단히 서비스에 삽입하십시오.

그런 다음 귀하의 TestBed 제공자에서 { provide: Transfer, useClass: TransferMock }을 사용할 수 있습니다. 날조 - - 서비스 스터 빙을

업데이트

의존성 삽입 (Dependency Injection)의 주된 목적은 코드를 테스트 할 수 있도록하고 조롱을 허용하는 것입니다.

업데이트

의존성 주입하면 다른 환경에 대한 공급자의 다른 세트를 구성 할 수 있습니다.

예를 들어, 브라우저에서 응용 프로그램을 실행하고 기본 모바일 환경에서 구성을 바꿀 수 있습니다.

const TRANSFER_PROVIDER: any; 

if (environment.browser) { 
    TRANSFER_PROVIDER = Transfer; 
} else { 
    TRANSFER_PROVIDER = { provide: Transfer, useClass: NativeTransfer } 
} 

... 
providers: [ TRANSFER_PROVIDER ] 

NativeTransfer이 아무것도하지 않는 단순한 스텁 수 있지만 오류를 방지하거나, 사용자가이 기능을 브라우저에서 지원되지 않음을 알려 수 있었다 : 모듈에서

당신이 뭔가를 할 수 .

+0

빠른 답장을 보내 주신 Martin 감사합니다.내 질문에 언급 한 것처럼''전근 ''이 내 서비스에 주입되지 않는다. 하나의 함수 만''전송 ''을 사용합니다. 그래서 주사하지 않으면 초기로드 시간을 줄일 수 있습니다. (?). 그래서 나는이 방법으로 그것의 구조가 있다면 어쨌든 모의가 있는지 알고 싶다? – raj

+1

아니요. 마틴의 말대로해야합니다. 한 가지 방법으로 만 사용 되더라도 서비스에 전송하는 데는 단점이 없습니다. 이것은 일반적인 패턴입니다. – philipooo

+0

@raj Dependancy Injection을 사용하면 성능이 저하되지 않습니다. 대신 테스트 할 수있는 코드의 이점을 누릴 수 있습니다. – Martin