2014-03-03 4 views
2

그것은 타이프 라이터가 모든 파일의 상단에 __extends 선언을 포함, 내 코드를 컴파일 할 때이 잘 배후에서 작동타이프 코드 커버리지는

var __extends = this.__extends || function (d, b) { 
    /* istanbul ignore next */ 
    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; 
    function __() { this.constructor = d; } 
    __.prototype = b.prototype; 
    d.prototype = new __(); 
}; 

을하지만, 불일치하는 경우를 생성 카르마 커버리지와 같은 것을 사용하여 보고서를 작성합니다. 이 선언은 코드에서 두 개의 함수 호출과 분기 (|| 사용법)를 포함하며 첫 번째 선언에서만 실행되며 이후에는 수십 개 (수백 개는 아니더라도)의 선언이 적용되지 않습니다. 이렇게하면 100 % 코드 커버리지를 가진 파일이 커버리지 리포트에서 잘 보이지 않게됩니다.

누구든지이 문제를 해결 했습니까?

답변

1

2.1 이후, 외부 도우미 라이브러리에 대한 타이프 라이터 지원, 모든 방출 기능은 tsconfig가 tslib 패키지

npm install --save tslib 

변화에 간다 필요한 경우 패키지 아래 예와 같이

var tslib_1 = require("tslib"); 

var MyClass = (function (_super) { 
    tslib_1.__extends(MyClass, _super); 
    function MyClass() { 
     return _super !== null && _super.apply(this, arguments) || this; 
    } 
    return MyClass; 
}(controller_1.Controller)); 
+0

이것은 현재 올바른 해결 방법입니다. 감사합니다. 감사합니다. – stolli

-2

typescript 컴파일러는 extends 키워드가있는 모든 파일 위에이 파일을 생성합니다. 단일 용도로 만드는 유일한 방법은 --out 컴파일러 플래그가있는 단일 js 파일로 컴파일하는 것입니다.

+1

답장을 보내 주셔서 감사합니다. 그러나 이것은 문제의 재발 명입니다. 분명히 단일 파일로 컴파일하면 거의 쓸모없는 커버리지 리포트가 생성됩니다. TSC가 이에 대한 옵션을 가져야하는 것처럼 보입니다. 또는 karma-coverage 옵션 ... 또는 창의적인 쉘 스크립트 솔루션을 통해 이러한 여러 인스턴스를 무시할 수있는 방법이 있어야합니다. 다른 사람들이 할 수있는 일이 궁금합니다. – stolli

3

typescript codeplex에서 작업 항목을 찾았습니다. 타이프 크로 트 (titcript) 사람들이 곧이 문제를 해결하기를 바랍니다. 여기에서 자세한 내용을 확인할 수 있습니다 : typescript workitem 2002

+0

감사합니다. 우리는 실제로 복제본으로 표시된 유사한 티켓을 제출했습니다. 그 동안 우리는 컴파일러를 포크하고 _noExtends 옵션을 구현했으며 매력처럼 작동합니다.) – stolli

+0

CodePlex 문제가 종료되었습니다. 시도해보십시오. https://github.com/Microsoft/TypeScript/issues/1350 – elwyn

3

상속을 사용하는 파일의 맨 위에 머리글을 추가하는 함수를 스크립트 작업에 만들었습니다. 이것은 코드 커버리지를 많이 끌어 올렸다. 나는 이스탄불을 사용하고, 그래서 내 기능은 다음과 같습니다

function istanbulIgnoreTypeScriptExtend() { 
    var tsExtends = /^var __extends =/; 
    return through.obj(function(file, enc, done) { 
     if (file.isBuffer() && tsExtends.test(file.contents)) { 
      file.contents = Buffer.concat([ 
       new Buffer('/* istanbul ignore next: TypeScript extend */' + os.EOL), 
       file.contents 
      ]); 
     } 
     this.push(file); 
     done(); 
    }); 
} 

내가 실제로 꿀꺽 플러그인으로 게시 할 수 있지만, 나는 곧 문제를 해결할 수있는 새로운 방법이있다 바라고 있어요.

1

다음은 their answer에 제공된 @jedmao 함수를 꿀꺽 꿀꺽 삼기 작업과 함께 사용하는 예입니다. 파일의 첫 번째 내용이 아닌 var __extends=을 처리하기 위해 약간 수정했습니다 (예 : 'use strict' 또는 /// <references 태그가있는 경우). 내가 여기에서하고있는 것처럼 \n보다는 jedmao가했을 때 os.EOL을 사용해야 할 것입니다.

{ 
    "compilerOptions": { 
     //all the other stuff 
     "importHelpers": true 
    } 
} 

다음 타이프 라이터가 자동으로 tslib를 가져옵니다 :

var gulp  = require('gulp'); 
var through2 = require('through2'); 

gulp.task('my-gulp-task', function() { 
    gulp.src('*.ts') 
     .pipe(myTypeScriptCompiler()) 
     .pipe(istanbulIgnoreTypeScriptExtend()) 
     .pipe(gulp.dest('myDestFolder')); 
}); 

function istanbulIgnoreTypeScriptExtend() { 
    var tsExtends = /var __extends =/; 
    return through2.obj(function(file, enc, done) { 
     if (file.isBuffer() && tsExtends.test(file.contents)) { 
      var rows = file.contents.toString().split('\n'); 
      for (var i = 0; i < rows.length; i++) { 
       if (rows[i].indexOf('var __extends =') === 0) { 
        rows.splice(i, 0, '/* istanbul ignore next: TypeScript extend */'); 
        break; 
       } 
      } 
      file.contents = new Buffer(rows.join('\n')); 
     } 
     this.push(file); 
     done(); 
    }); 
}