【问题标题】:gulp-jasmine Window is not defined errorgulp-jasmine 窗口未定义错误
【发布时间】:2014-12-01 09:06:47
【问题描述】:

我正在使用 gulp / gulp-jasmine / angular 来运行我的单元测试。但是,我在运行 Gulp 目标时遇到以下错误:

C:\Projects\website2>gulp test
[01:53:10] Using gulpfile C:\Projects\website2\gulpfile.js
[01:53:10] Starting 'test'...
[01:53:11] Version: webpack 1.4.13
         Asset     Size  Chunks             Chunk Names
test.bundle.js  1051728       0  [emitted]  test
F

Failures:
1) Exception loading: C:\Projects\website2\scripts\dist\test.bundle.js Error
1.1) ReferenceError: window is not defined

1 spec, 1 failure
Finished in 0.015 seconds
[01:53:11] 'test' errored after 916 ms
[01:53:11] Error in plugin 'gulp-jasmine'
Message:
    Tests failed

我相信 gulp-jasmine 使用 PhantomJS(没有触发浏览器窗口)。有人可以帮我解决我做错的事情吗?是否有我缺少的配置设置?

这是我的 gulpfile.js:

var gulp = require('gulp');
var path = require('path');
var webpack = require('gulp-webpack');
var webpackConfig = require('./webpack.config');
var testWebpackConfig = require('./test.webpack.config');
var jasmine = require('gulp-jasmine');

gulp.task('default', ['build'], function() {

});

gulp.task('build', function() {
    return gulp.src(['scripts/app/**/*.js', '!scripts/app/**/*.tests.js'])
       .pipe(webpack(webpackConfig))
       .pipe(gulp.dest('scripts/dist'));
});

gulp.task('test', function() {
    return gulp.src(['scripts/app/**/*.tests.js'])
       .pipe(webpack(testWebpackConfig))
       .pipe(gulp.dest('scripts/dist'))       
       .pipe(jasmine());
});

【问题讨论】:

  • 这个问题有什么进展吗?我也遇到了同样的问题。
  • 我怀疑“未定义窗口”错误与 Angular 需要浏览器上下文和工作 DOM 才能正确加载有关。 jasmine 只是一个测试框架。我认为您需要一个提供 DOM API(即窗口)的浏览器。我发现 PhantomJS 很适合这个。请参阅下面的答案。

标签: angularjs jasmine gulp gulp-jasmine


【解决方案1】:

gulp-jasmine 通过 Node.js 运行测试,因此不适合客户端测试,请参阅 https://github.com/sindresorhus/gulp-jasmine/issues/46

对于客户端测试,如果您想使用 Jasmine(而不是 Karma 或并行),您可以编写一个 SpecRunner.html 文件(名称无关紧要)并在浏览器中运行:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Jasmine Spec Runner</title>

    <!-- You need to specify package 'jasmine-core' in your Node.js package.json -->

    <link rel="shortcut icon" href="node_modules/jasmine-core/images/jasmine_favicon.png">
    <link rel="stylesheet" href="node_modules/jasmine-core/lib/jasmine-core/jasmine.css">

    <script src="node_modules/jasmine-core/lib/jasmine-core/jasmine.js"></script>
    <script src="node_modules/jasmine-core/lib/jasmine-core/jasmine-html.js"></script>
    <script src="node_modules/jasmine-core/lib/jasmine-core/boot.js"></script>

    <!-- Source and Spec dependencies -->
    <script src="node_modules/underscore/underscore.js"></script>
    <script src="node_modules/angular/angular.js"></script>
    <script src="node_modules/angular-mocks/angular-mocks.js"></script>

    <!-- Source files -->
    <script src="app/MySourceCode1.js"></script>
    <script src="app/MySourceCode2.js"></script>

    <!-- Spec files -->
    <script src="test/MySourceCode1.spec.js"></script>
    <script src="test/MySourceCode2.spec.js"></script>
  </head>
  <body>
  </body>
</html>

或者使用gulp-jasmine-browser:

var gulp = require('gulp');
var $ = require('gulp-load-plugins')();

// You need to specify packages 'jasmine-core' and 'gulp-jasmine-browser'
// in your Node.js package.json

gulp.task('jasmine', function() {
  return gulp.src([
    'node_modules/underscore/underscore.js',
    'node_modules/angular/angular.js',
    'node_modules/angular-mocks/angular-mocks.js',

    'app/MySourceCode1.js',
    'app/MySourceCode2.js',
    'test/MySourceCode1.spec.js',
    'test/MySourceCode2.spec.js',
  ])
    .pipe($.jasmineBrowser.specRunner())
    .pipe($.jasmineBrowser.server());
});

或使用Karma :)

【讨论】:

    【解决方案2】:

    我能够以另一种方式解决这个问题,将 PhantomJS 用于无头浏览器,将 karma 用于命令行测试运行器,将 jasmine 用于测试框架,并将 gulp 用于任务运行器。

    karma.conf.js

    module.exports = function(config) {
        config.set({
            basePath: './',
    
            files: [
                'node_modules/angular/angular.js',
                'node_modules/angular-mocks/angular-mocks.js',
                'index-controller.js',
                'index-controller.tests.js'
            ],
    
            exclude: [
            ],
    
            autoWatch: true,
    
            frameworks: ['jasmine'],
    
            browsers: ['PhantomJS'],
    
            plugins: [
                'karma-jasmine',
                'karma-junit-reporter',
                'karma-chrome-launcher',
                'karma-firefox-launcher',
                'karma-phantomjs-launcher'
            ],
    
            junitReporter: {
                outputFile: 'unit.xml',
                suite: 'unit'
            }
    
        })
    }
    

    安装必要的 npm 模块:

    npm install angular
    npm install angular-mocks
    npm install -g gulp
    npm install gulp
    npm install karma
    npm install -g karma-cli
    npm install karma-jasmine
    npm install karma-junit-reporter
    npm install karma-chrome-launcher
    npm install karma-firefox-launcher
    npm install karma-phantomjs-launcher
    npm install phantomjs
    

    更新您的 gulpfile.js 并提供两个任务:运行单元测试一次的默认任务,监视文件系统并在任何文件更改时运行测试的 TDD 任务:

    gulpfile.js

    var gulp = require('gulp');
    var karma = require('karma').server;
    gulp.task('default', function(done) {
      karma.start({      
        configFile: __dirname + '/karma.conf.js', 
            singleRun: true 
       }, done); 
    
    });
    
    gulp.task('tdd', function (done) { 
       karma.start({ 
         configFile: __dirname + '/karma.conf.js' 
       }, done); 
    }); 
    

    触发:

    gulp default
    gulp tdd
    

    为了完整起见,这是我的索引控制器和相关测试:

    index-controller.js

    var app = angular.module('app', []);
    app.controller('ctrl', function($scope) { 
        $scope.name = 'mickey mouse';
    });
    

    index-controller.tests.js

    describe('index-controller', function() {
        beforeEach(module('app'));
        var $controller;
    
        beforeEach(inject(function(_$controller_){
            // The injector unwraps the underscores (_) from around the 
            // parameter names when matching
            $controller = _$controller_;
        }));
    
        describe('$scope.name', function() {
            it('should be mickey mouse', function() {
                var $scope = {};
                var controller = $controller('ctrl', { $scope: $scope });
    
                expect($scope.name).toEqual('mickey mouse');
            });
    
      });
    });
    

    【讨论】:

    • Karma requires node_module 中以 karma- 开头的所有内容,因此您不需要配置的 plugins 部分,除非您有 node_modules/karma-* 您需要排除但无法删除。
    猜你喜欢
    • 2017-01-27
    • 2017-04-01
    • 1970-01-01
    • 2014-11-12
    • 2016-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-23
    相关资源
    最近更新 更多