jasmine-node js 并使用 done() 完成异步测试

jasmine-nodejs and using done() to complete asynch tests

我似乎在为我的 NodeJS 应用设置单元测试然后 运行使用 Jasmine 对它们进行测试时遇到问题。问题来自于使用 Jasmine 的 done 函数。每当我在测试中包含 done 函数时,我都会收到一条错误消息:Warning: Cannot read property 'clearTimeout' of undefined Use --force to continue. 我很确定我没有做正确的事情,但那件事是什么一直在躲避我。

我的Gruntfile.js:

module.exports = function(grunt){
    // Load grunt tasks automatically
    require('load-grunt-tasks')(grunt);

    grunt.initConfig({
        // Make sure code styles are up to par and there are no obvious mistakes
        jshint: {
            options: {
                jshintrc: '.jshintrc'
            },
            all: [
                'Gruntfile.js',
                'app/scripts/Directives/**/*.js',
                'app/scripts/Services/**/*.js',
                'app/scripts/app.js'
            ]
        },

        // Empties folders to start fresh
        clean: {
            options: { force: true },
            dist: {
                files: [
                    {
                        dot: true,
                        src: [
                            '/dist/*'
                        ]
                    }
                ]
            },
            coverage: {
                files: [
                    {
                        dot: true,
                        src: [
                            '.coverage/'
                        ]
                    }
                ]
            }
        },

        // Copies remaining files to places other tasks can use
        copy: {
            dist: {
                files: [
                    {
                        expand: true,
                        dot: true,
                        cwd: '<%= yeoman.app %>',
                        dest: '<%= yeoman.dist %>',
                        src: [
                            '*.{ico,png,txt,json,js,shtml,template}',
                            'images/{,*/}*.{webp}',
                            'fonts/*',
                            'images/**/*.svg',
                            'api-documentation/**/**/*',
                            'api-explorer/**/*',
                            'styles/*.{ttf,woff,svg,css}',
                            'docs/**/*',
                            'template/**/*.{htm,html}',
                            'locale/*',
                            'config/*'
                        ],
                        rename: function(dest, src){

                            if(src.indexOf('customizations.html.template') !== -1 ||
                                src.indexOf('customizations.js.template') !== -1){
                                console.log( dest + '/' + src.replace('.template', ''));
                                return dest + '/' + src.replace('.template', '');
                            }

                            return dest + '/' + src;
                        }
                    },
                    {
                        expand: true,
                        cwd: '.tmp/images',
                        dest: '<%= yeoman.dist %>/images',
                        src: [
                            'generated/*'
                        ]
                    },
                    {
                        expand:true,
                        cwd: '.tmp/styles',
                        dest: '<%= yeoman.dist %>/styles',
                        src:['customer.css']
                    }
                ]
            }
        },

        // Test settings
        karma: {
            unit: {
                configFile: 'karma.conf.js',
                singleRun: true,
                reporters: ['dots']
            },
            coverage: {
                configFile: 'karma.coverage.conf.js',
                singleRun: true,
                reporters: ['spec', 'coverage'],
                coverageReporter: {
                    type: 'html',
                    dir: '.coverage/'
                }
            },
            node:{
                configFile:'karma.node.conf.js',
                singleRun:true,
                reporters:['spec', 'coverage'],
                coverageReporter: {
                    type: 'html',
                    dir: '.nodeCoverage/'
                }
            }
        },

        open : {
            coverage : {
                path: 'http://127.0.0.1:8888/src'
            },
            covReport: {
                path: 'http://localhost:63342/ClassroomLibrary/' + grunt.file.expand('.coverage/Phantom*/index.html')
            }
        },

        jasmine_nodejs:{
            options:{
                specNameSuffix:'node.spec.js',
                reporters:{
                    console:{
                        colors:true,
                        cleanStack:1,
                        verbosity:4,
                        listStyle:'indent',
                        activity:false
                    }
                }
            },
            all:{
                options:{
                    useHelpers:true
                },
                specs:[
                    'tests/Node/**'
                ]
            }
        },
        nodemon:{
            tests:{
                script:'app/index.js'
            }
        },
        concurrent:{
            nodeTests:['nodemon', 'jasmine_nodejs']
        },
        run_node:{
            start:{
                files:{src:['app/index.js']}
            }
        },
        stop_node:{
            stop:{
                files:{src:['app/index.js']}
            }
        }
    });

    grunt.loadNpmTasks('grunt-jasmine-nodejs');
    grunt.loadNpmTasks('grunt-nodemon');
    grunt.loadNpmTasks('grunt-concurrent');
    grunt.loadNpmTasks('grunt-run-node');

    grunt.registerTask('test', [
        'karma:unit'
    ]);

    grunt.registerTask('coverage', [
        'clean:coverage',
        'karma:coverage',
        'open:covReport'
    ]);

    grunt.registerTask('nodeTests', ['concurrent:nodeTests']);
    grunt.registerTask('testingNode', ['run_node', 'jasmine_nodejs', 'stop_node']);
    //grunt.registerTask('karmaNode', ['run_node', 'karma:node', 'stop_node']);
};

有问题的测试套件:

var request = require('http');
describe('Node server', function(){
    'use strict';

    //http://www.randomjavascript.com/2012/12/using-jasmine-node-to-test-your-node.html
    var serverUrl = 'http://127.0.0.1:2425';

    it('should respond to /', function(done){
        request.get(serverUrl, function(response){
            expect(response.statusCode).toBe(200);
            done();
        });
    });
});

显然,我已经尝试了几种不同的方法来实现它。 运行 他们通过 Karma 遇到的麻烦多于它的价值(我把那个配置留在那里以展示我尝试过的东西。)虽然我对 nodeMon 和 jasmine-nodejs 的输出很满意,但我仍然无法得到整个事情从前到后 运行 因为没有 done 功能,事情就像你期望的那样挂起。它应该就在那里,但对我来说不是。我的 package.json 包含:

{
  "name": "myProject",
  "version": "0.0.1",
  "dependencies":{},
  "devDependencies": {
    "karma": "~0.13",
    "karma-coverage": "~0.5",
    "karma-phantomjs-launcher": "~1.0",
    "karma-ng-html2js-preprocessor": "~0.1",
    "phantomjs-prebuilt": "~2.1",
    "grunt": "~1.0",
    "grunt-contrib-clean": "~0.7",
    "grunt-contrib-uglify": "~0.11",
    "grunt-contrib-concat": "~0.5",
    "grunt-contrib-copy": "~1.0",
    "grunt-concurrent":"~2.3",
    "grunt-jasmine-nodejs":"~1.5",
    "grunt-jasmine-node-coverage":"0.5.0",
    "grunt-open":"~0.2",
    "grunt-nodemon":"~0.4",
    "grunt-run-node":"~0.1",
    "grunt-karma": "~0.12",
    "jasmine-core": "~2.4",
    "jasmine-node":"~1.14",
    "karma-jasmine": "~0.3",
    "karma-jasmine-matchers": "~2.0",
    "karma-spec-reporter":"~0.0",
    "karma-requirejs":"~1.0",
    "load-grunt-tasks": "~3.4",
    "uglify-js": "~2.6",
    "grunt-sass": "~1.1",
    "jshint":"~2.9"
  },
  "engines": {
    "node": ">=0.12.0"
  },
  "scripts": {
    "global": "npm i karma-cli grunt-cli -g"
  }
}

谁能告诉我进程哪里缺少它需要的东西?

一个想法——你能确认你实际使用的 Jasmine 版本与你打算使用的相匹配吗?我认为 'done' 回调是在 2.0 中添加的,所以我可以看到这个错误发生在旧版本上...

编辑:您正在使用 1.3.1 版本的 "jasmine-node" 软件包,因此该功能将不可用。