angular2 / testing beforeEach不是一个函数

时间:2016-04-28 13:03:18

标签: typescript angular gulp jasmine systemjs

所以我使用Gulp,Gulp-Jasmine和SystemJS来测试Angular2演示应用程序。真的很简单。我设法让System.config块工作,并加载规范文件,但是当尝试运行带有以下错误的beforeEach块时,它会失败......

  

{[错误:TypeError:_global.beforeEach不是函数               在Object.eval(D:/ ng2demo / node_modules / angular2 / src / testing / matcher   s.js:26:9)               在eval(D:/ng2demo/node_modules/angular2/src/testing/matchers.js:20   5:4)               在eval(D:/ng2demo/node_modules/angular2/src/testing/matchers.js:20   6:3)               在eval(原生)               在Object.eval(D:/ ng2demo / node_modules / angular2 / src / testing / testing   的.js:10:18)               在eval(D:/ng2demo/node_modules/angular2/src/testing/testing.js:245   :4)               在eval(D:/ng2demo/node_modules/angular2/src/testing/testing.js:246   :3)               在eval(原生)           评估D:/ng2demo/node_modules/angular2/src/testing/matchers.js           评估D:/ng2demo/node_modules/angular2/src/testing/testing.js           评估D:/ng2demo/node_modules/angular2/testing.js           加载D时出错:/ng2demo/app/assets/services/config.service.spec.js]     originalErr:[TypeError:_global.beforeEach不是函数]}

我的gulp任务概述如下......

var gulp = require('gulp');
var jasmine = require('gulp-jasmine');
var System = require('systemjs');

gulp.task('newtest', () => {
    System.config({
        baseURL: "",
        transpiler: 'typescript',
        defaultJSExtensions: true,
        packages: {
            app: {
                format: 'register',
                defaultExtension: 'js'
            },
        },      
        map:{           
            'angular2':'node_modules/angular2',
            'rxjs':'node_modules/rxjs',
        },
    });

    Promise.all([
        System.import('app/assets/services/config.service.spec'),
    ]).then(function(){     
        gulp.src(['app/assets/services/config.service.spec'])
            .pipe(jasmine())
    }).catch(console.error.bind(console));
});

我的spec文件看起来像这样......

/// <reference path="../../../typings/browser/ambient/systemjs/index.d.ts"/>
/// <reference path="../../../typings/browser/ambient/jasmine/index.d.ts"/>

import {Injector, provide} from "angular2/core";
import {Http, BaseRequestOptions, Response, ResponseOptions} from "angular2/http";
import {MockBackend} from "angular2/http/testing";
import {ConfigService} from "./config.service";
import {it, describe, beforeEach, inject, expect} from "angular2/testing";

describe("ConfigService", () => {

    // THIS IS THE LINE THAT FAILS !!!
    beforeEach(() => {
        //Do some prep
    });
    it("it does a test and evals to true", () => {
        expect(true).toBe(true);
    });
});
  • 我做错了什么,如何通过这个错误???
  • 我是否需要规范顶部的参考路径或者有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

  

TypeError:_global.beforeEach不是Object.eval的函数

错误来自angular2/testing,您可以look at the source查看原因。它试图从全局对象中导入beforeEach并且它不存在。导入jasmine不会有帮助,因为在node.js中加载时,它不会改变全局对象。

  

如何通过此错误???

好吧,我建议有几种方法。如果您打算在Web浏览器中运行此代码,我建议您在浏览器中而不是在节点中测试代码。

  1. 按照angular2 docs中的(不完整)指南进行测试。这涉及设置一个用于运行测试的html文件。如果您计划使用gulp
  2. 自动化测试运行,那么这不是您想要的
  3. 使用this angular2 seed(或其他)作为模型,了解如何一起使用Angular2,SystemJs,Jasmine和Karma。业力转轮默认为Chrome,但如果您愿意,可以将其更改为PhantomJS。这很好用,我上周刚刚为angular1应用做了这个。
  4.   

    我是否需要规范顶部的参考路径或是否有更好的方法?

    自从Typescript 1.5以来,有一种更好的方法,我全心全意地推荐它。将tsconfig.json file添加到项目的根目录中。当然,这已经在我上面链接的angular2种子中为你完成了。