【问题标题】:jasmine-nodejs and using done() to complete asynch testsjasmine-node js 并使用 done() 完成异步测试
【发布时间】:2016-05-20 09:07:13
【问题描述】:

我似乎在为我的 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"
  }
}

有人可以告诉我这个过程在哪里缺少它需要的东西吗?

【问题讨论】:

    标签: javascript node.js jasmine jasmine-node


    【解决方案1】:

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

    编辑:您使用的是版本 1.3.1 的“jasmine-node”包,因此该功能将不可用。

    【讨论】:

    • 好收获!我没看过。
    猜你喜欢
    • 1970-01-01
    • 2018-11-23
    • 2020-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多